2017-08-06 29 views
18

Tôi không hiểu tại sao đoạn mã sau biên dịch trên GCC 8.0:Tại sao tham chiếu rvalue này liên kết với một giá trị l?

decltype(auto) foo(int&& r) { 
    return r; 
} 

Trong foo, kiểu tuyên bố rint&&, và do đó kiểu trả về của foo cũng là int&&. Nhưng r chính nó là một lvalue, và một lvalue không thể liên kết với một tham chiếu rvalue.

Tôi có thiếu gì đó không?

+0

Sao chép với [gcc8] (https://wandbox.org/permlink/4CSGrHnZ26nGL8QK), có vẻ như gcc8 đã suy ra kiểu trả về là 'int &'. – songyuanyao

+0

@songyuanyao Họ yêu cầu biên dịch mã, vì vậy sẽ không có repro. –

+1

@BaummitAugen Mã cố định biên dịch với [gcc8] (https://wandbox.org/permlink/7mUFIa2VVAwgprEM), nhưng không phải [clang6] (https://wandbox.org/permlink/3lpIoyciSWUisYh7). – songyuanyao

Trả lời

14

Theo [dcl.spec.auto]/5, loại trả về được suy ra như thể toán hạng của câu lệnh return là toán hạng của decltype. Và [dcl.type.simple]/(4.2) nêu rõ rằng, khi toán hạng không được đặt dấu ngoặc đơn, loại đối tượng là loại được tạo bởi decltype, tức là, int&&. Và thực sự, r là một lvalue ([expr.prim.id.unqual]).

May mắn thay, điều này đã được phát hiện và nộp là bug 64892 hai năm trước. (Tôi tự hỏi tại sao không ai có thể tìm ra thời gian để sửa lỗi này?)

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