2013-07-07 36 views
8

tôi có chương trình thử nghiệm sau đây:mảng const tạm thời không liên kết với tài liệu tham khảo rvalue

#include <iostream> 
#include <type_traits> 
#include <utility> 

template<typename Ty, std::size_t N> 
void foo(Ty (&&)[N]) 
{ 
    std::cout << "Ty (&&)[" << N << "]\t" << std::is_const<Ty>::value << '\n'; 
} 

template<typename Ty, std::size_t N> 
void foo(Ty (&)[N]) 
{ 
    std::cout << "Ty (&)[" << N << "]\t" << std::is_const<Ty>::value << '\n'; 
} 

template<typename Ty> 
using id = Ty; 

int main() 
{ 
    std::cout.setf(std::cout.boolalpha); 

    foo(id<int[]>{1, 2, 3, 4, 5}); 
    foo(id<int const[]>{1, 2, 3, 4, 5}); // <-- HERE. 
    int xs[]{1, 2, 3, 4, 5}; 
    foo(xs); 
    int const ys[]{1, 2, 3, 4, 5}; 
    foo(ys); 
    foo(std::move(xs)); 
    foo(std::move(ys)); 
} 

Tôi hy vọng rằng các dòng được đánh dấu bằng một mũi tên sẽ gọi quá tải rvalue như các cuộc gọi không const chỉ ở trên nó nhưng nó không.

Đây có phải chỉ là lỗi trong GCC hoặc có điều gì đó trong tiêu chuẩn gây ra quá tải lvalue được chọn không?

+0

Thú vị, Clang nhận được điều này đúng và gọi quá tải rvalue. – Xeo

+0

Câu hỏi hay: sự hiểu biết ngây thơ của tôi về tiêu chuẩn đồng ý với bạn. [Live] (http://ideone.com/ErHuYO) nếu bạn muốn xem đầu ra. – Yakk

+0

Điều gì đó buồn cười xảy ra ở đây: http://ideone.com/ptTJ8i - 'const int' tạm thời của tôi đang được xử lý như một' int && ', không phải là 'const int &&'. – Yakk

Trả lời

2

Theo tiêu chuẩn §12.2 [class.temporary]:

temporaries của kiểu lớp được tạo ra trong những bối cảnh khác nhau: ràng buộc một tham chiếu đến một prvalue (8.5.3), trả lại một prvalue (6.6.3), một chuyển đổi tạo ra giá trị gia tăng (4.1, 5.2.9, 5.2.11, 5.4), ném ngoại lệ (15.1), nhập trình xử lý (15.3) và trong một số lần khởi động (8.5).

Vì vậy id<int const[]>{1, 2, 3, 4, 5} là tạm thời và do đó là một prvalue §3.10 [basic.lval]:

Một rvalue (cái gọi là, về mặt lịch sử, bởi vì rvalues ​​thể xuất hiện trên phía bên tay phải của một biểu thức gán) là một xvalue, một đối tượng tạm thời là (12.2) hoặc giá trị phụ, hoặc giá trị không phải là được liên kết với một đối tượng.

Giá trị (giá trị "thuần túy") là một giá trị không phải là xvalue.

Do đó sẽ được chọn chức năng quá tải với đối số tham chiếu rvalue.

+0

Vì vậy, về cơ bản nó là một lỗi trong GCC? – Mehrdad

+0

@Mehrdad: Tôi cho là vậy. Như Xeo đã chỉ ra trong bình luận của mình, Clang nhận được điều này đúng. –

Các vấn đề liên quan