Mã sau có hợp pháp không?Tham chiếu rvalue có cho phép chuyển đổi ngầm không?
std::string&& x = "hello world";
g ++ 4.5.0 biên dịch mã này mà không gặp bất kỳ sự cố nào.
Mã sau có hợp pháp không?Tham chiếu rvalue có cho phép chuyển đổi ngầm không?
std::string&& x = "hello world";
g ++ 4.5.0 biên dịch mã này mà không gặp bất kỳ sự cố nào.
Điều này được thảo luận trên usenet hiện tại. Xem Rvalue reference example in 8.5/3 correct or wrong?.
Nó không hợp pháp.
@Jerry đó là một subbullet của "tham chiếu sẽ là một tham chiếu rvalue và biểu thức khởi tạo sẽ là một rvalue", mà string-literal không đáp ứng. –
@Jerry string literals là lvalues, như trong C. Xem 5.1.1/1. Không giống như ints đơn giản, chúng đề cập đến các đối tượng và cần phải chuyển đổi thành con trỏ. Vì vậy, họ thực sự có tài sản là một "giá trị định vị lưu trữ" (mà giá trị tham chiếu đến các đối tượng). –
@Johannes: Yup - Tôi đã không tìm thấy 5.1.1/1, rõ ràng là nói như vậy. Cảm ơn. Điều đó rõ ràng làm cho việc giải thích là không thể. –
Bạn có biết bất kỳ trường hợp sử dụng thú vị nào cho điều này không? Tôi nghĩ lý do duy nhất để đặt tên cho rvalues là ràng buộc với sự quá tải đặc biệt. – Inverse
@ Ngược lại: Vâng, đó là lý do tại sao tôi đã thực sự yêu cầu, đi qua các đối số cho các chức năng. Chỉ có vậy, với mục đích đặt câu hỏi, tôi không muốn viết và gọi hàm;) Về mặt kỹ thuật, không có thứ gì như một giá trị được đặt tên (ngoại trừ các từ khóa 'this' và' nullptr'). Bạn có thể có nghĩa là một tham chiếu rvalue * có tên * - giống như 'x' trong ví dụ này, đây là một giá trị, không phải là một rvalue. – fredoverflow