2011-04-08 41 views
38

tôi thấy mã trên StackOverflow mỗi một lần trong một thời gian, yêu cầu về một số mơ hồ quá tải với một cái gì đó liên quan đến một chức năng như:Reference tham chiếu trong C++

void foo(int&& param); 

Câu hỏi của tôi là: Tại sao điều này thậm chí đi lên? Hay đúng hơn, khi nào bạn sẽ có "một tham chiếu đến một tham chiếu"? Làm thế nào mà bất kỳ khác nhau từ một tài liệu tham khảo cũ đồng bằng? Tôi đã không bao giờ chạy qua điều này trong mã thế giới thực, vì vậy tôi tò mò muốn loại mã sẽ cần điều này.

Trả lời

39

Đó là tham chiếu giá trị, Bjarne mô tả số here.

Shameless sao chép ("trích dẫn"):

Tham chiếu rvalue

Một tài liệu tham khảo rvalue là một loại hợp chất rất giống với truyền thống tham khảo C++ 's. Để phân biệt tốt hơn các loại này, chúng tôi tham chiếu đến tham chiếu truyền thống C++ dưới dạng tham chiếu giá trị lvalue. Khi tham chiếu cụm từ được sử dụng, nó đề cập đến cả hai loại tham chiếu: tham chiếu lvalue và tham chiếu rvalue.

Tham chiếu lvalue được tạo thành bởi đặt & sau một số loại.

A a; A& a_ref1 = a; // an lvalue reference 

Một tài liệu tham khảo rvalue được hình thành bởi đặt một & & sau khi một số loại.

A a; A&& a_ref2 = a; // an rvalue reference 

Một rvalue tham khảo hoạt động giống như một tài liệu tham khảo giá trị trái ngoại trừ việc nó có thể ràng buộc để tạm thời (một rvalue), trong khi bạn không thể ràng buộc một (không const) tham khảo giá trị trái với một rvalue.

A& a_ref3 = A(); // Error! 
A&& a_ref4 = A(); // Ok 
+9

Bất kỳ ý tưởng nào tại sao mọi người đều muốn - hãy để một mình cần — để sử dụng điều này? – wallyk

+1

Tìm kiếm "chuyển tiếp hoàn hảo" –

+0

@wallyk: Cải thiện quản lý tài nguyên. – GManNickG

14

Nó không phải là tham chiếu đến tham chiếu: một điều như vậy không tồn tại.

Đây là một rvalue reference, một tính năng mới được thêm vào C++ 11 sắp được chuẩn hóa.

+7

bạn có thể giải thích sự khác biệt không? – hhafez

7

Đó là tham chiếu giá trị. Lưu ý rằng mã thông báo && được sử dụng cho các tham chiếu Boolean AND và rvalue và mã thông báo & được sử dụng cho bitwise AND và tham chiếu thông thường, là các "từ" khác nhau theo ngôn ngữ có thể cho biết.

Tham chiếu rvalue (thường) được gắn với một đối tượng có thể bị bỏ lại ở trạng thái không xác định sau khi tham chiếu rvalue kết thúc, có lẽ vì đối tượng sẽ bị hủy.

Đặt một cách đơn giản, ràng buộc biến với tham chiếu rvalue thường là điều cuối cùng bạn làm với nó.

Không giống như tham chiếu thông thường nhưng như tham chiếu const &, tham chiếu rvalue có thể liên kết với một giá trị (một biểu thức có địa chỉ không thể được lấy trực tiếp).Giống như tham chiếu thông thường nhưng không giống như tham chiếu const &, có thể sử dụng tham chiếu rvalue để sửa đổi đối tượng của nó.

+0

"không xác định" của một chút quá tuyên bố ... nó cần phải ở trong một trạng thái an toàn cho sự hủy diệt, nhưng không cần phải giữ lại giá trị trước đó của nó. –

+0

@Tony: Có, không xác định nhưng hợp lệ. Một hàm chấp nhận tham chiếu rvalue và sửa đổi nó, thường không xác định cách tham chiếu được sửa đổi. – Potatoswatter

+0

@Potatoswatter: xin lỗi - Tôi vẫn còn bối rối bởi các phát biểu của bạn. "thường không chỉ định cách tham chiếu được sửa đổi" ... giả định bởi "cách tham chiếu được sửa đổi", bạn có nghĩa là "cách đối tượng được tham chiếu được sửa đổi" (tôi không thể tưởng tượng bất kỳ điều gì khác) - chức năng thường quyết định chính xác điều đó, ví dụ: một hàm tạo di chuyển có thể sử dụng 'swap' trên vùng chứa và đánh cắp con trỏ, đặt chúng thành NULL trong đối tượng được tham chiếu .... –

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