2015-07-14 18 views
7

Tôi đang học tính năng giá trị của C++ 11. C++ Primer 5th edition nói rằng một tham chiếu rvalue chỉ có thể liên kết với một rvalue, nhưng khi tôi cố gắng biên dịch chương trình này, nó đã trôi qua, và đầu ra là 1 1.Tại sao lvalue để ràng buộc tham chiếu rvalue cho phép trên g ++ 4.4.6?

Tôi không hiểu tại sao. Tôi đang sử dụng g ++ 4.4.6, và biên dịch nó với

g ++ Wall -std = C++ 0x test.cpp -o test

#include <iostream> 

using namespace std; 

int main() 
{ 
    int i = 0; 
    int &&rr = i; 

    rr = 1; 
    std::cout << rr << std::endl; 
    std::cout << i << std::endl; 

    return 0; 
} 
+0

Quy tắc "tham chiếu rvalue không ràng buộc với giá trị" đã được thêm vào khá muộn trong quy trình chuẩn hóa C++ 11. Có lẽ GCC 4.4.6 đang thực hiện một dự thảo trước đó của đặc điểm kỹ thuật mà không có lệnh cấm đó. –

+0

Có lẽ thời gian để nâng cấp trình biên dịch của bạn :) –

Trả lời

6

Mã của bạn là không hợp lệ, một lvalue không thể liên kết với một tham chiếu rvalue giống như cuốn sách nói. g++5.1 rejects your code với thông báo lỗi

main.cpp:8:16: error: cannot bind 'int' lvalue to 'int&&' 
    int &&rr = i; 
       ^

g ++ 4.4.6 là released vào tháng Tư năm 2011, chưa đầy một tháng sau khi dự thảo cuối cùng cho C++ 11 là approved. Hành vi mà bạn đang thấy là lỗi gcc hoặc hành vi được chỉ định bởi một số bản thảo làm việc ban đầu của tiêu chuẩn C++ 11.

Quy tắc hiện tại được mô tả trong N2844 và được triển khai trong gcc 4.5.

+0

Để ghi lại, VS2013 và VS2015 RC cũng từ chối mã của bạn. –

+1

Có lẽ bạn nên xem xét thời gian phát hành là 4.4.0, vào tháng 4 năm 2009. –

+0

[N2118] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118 .html) bao gồm ví dụ này: 'double && rd4 = i; // OK, tham chiếu bị ràng buộc với tạm thời double' – o11c

6

Loạt GCC 4.4 lần đầu tiên được phát hành vào April 2009, và thân cây đã closed to all but regression and documentation fixes tốt trước đó, vào tháng năm 2008.

Nguyên tắc có thể ngăn chặn tham khảo rvalue từ ràng buộc để lvalues ​​được bình chọn vào tiêu chuẩn tháng 3 năm 2009, như giấy N2844, sau khi được đề xuất lần đầu tiên vào tháng 12 năm 2008, trên giấy N2812.

Do đó, quy tắc mới không thể thực hiện kịp thời cho GCC 4.4 (thực tế là đã được triển khai cho GCC 4.5).

+0

Vì vậy, khi họ phát hành cùng một nhánh cụ thể, họ không triển khai DR? Hoặc là N2844 không được coi là DR vì không có chuẩn C++ 11 vào thời điểm đó? – Praetorian

+0

@Praetorian Theo như tôi biết, chính sách là chỉ có các sửa lỗi hồi quy và tài liệu được thực hiện. –

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