Tôi đã gửi một lỗi GCC cho việc này, nhưng tôi muốn kiểm tra kỹ hơn điều này.Khởi tạo Brace so với Dấu ngoặc đơn
Hãy xem xét các chương trình sau:
#include <utility>
template<typename T, typename A>
void F(A&& a) { T(std::forward<A>(a)); } // Note:() syntax.
int main() { int i; F<int&>(i); }
và:
#include <utility>
template<typename T, typename A>
void F(A&& a) { T{std::forward<A>(a)}; } // Note: {} syntax.
int main() { int i; F<int&>(i); }
mới nhất Clang và MSVC trình biên dịch chấp nhận cả hai chương trình. GCC 5 và hơn thế nữa chấp nhận chương trình đầu tiên nhưng từ chối chương trình thứ hai, tuyên bố invalid cast of an rvalue expression of type 'int' to type 'int&'
.
Đây có phải là lỗi của GCC không? Hoặc đây thực sự là một sự khác biệt giữa T{}
và T()
trong ngữ cảnh trên (và do đó một lỗi trong Clang và MSVC)?
Edit:
Vấn đề này có thể được thu hẹp xuống trích đoạn đơn giản sau đây:
int i; (int&){i};
và
int i; (int&)(i);
Thậm chí bạn có thể xác định và khởi tạo tham chiếu giá trị không được đặt tên không? Lỗi này có vẻ không chính xác. – krzaq
@krzaq: Tôi không hiểu tại sao không. Ngoài ra, tôi nhấn lỗi này trong biểu thức 'noexcept', vì vậy tôi muốn hiểu tình huống trong ngữ cảnh biểu thức. – alecov
Đây là [vấn đề cốt lõi 1288] (http://wg21.link/cwg1288). GCC được cho là sẽ thực hiện giải pháp của mình, nhưng có lẽ nó không hoàn toàn cố định. –