2012-02-03 28 views
5

xem xét mã này:rvalue-tham chiếu đến mảng: nó có thực sự xảy ra không?

#include <iostream> 
using namespace std; 

typedef int array[12]; 

array sample; 

array ret1(){ //won't compile 
    return sample; 
} 

array& ret2(){ 
    return sample; 
} 

array&& ret3(){ 
    return sample; //won't compile 
} 

void eat(array&& v){ 
    cout<<"got it!"<<endl; 
} 

int main(){ 
    eat(ret1()); 
    eat(ret2()); //won't compile 
    eat(ret3()); //compiles, but I don't really know how to write a function that returns a rvalue-reference to an array 
} 

Phiên bản duy nhất mà thực sự dường như biên dịch là ret3(). Trong thực tế, nếu tôi bỏ qua việc thực hiện và chỉ khai báo nó, nó biên dịch (và không bao giờ liên kết tất nhiên), nhưng thực sự tôi không biết làm thế nào để trả về một tham chiếu rvalue một cách rõ ràng cho một mảng. Nếu điều này không thể xảy ra, thì tôi có thể kết luận rằng tham chiếu rvalue tới mảng không bị cấm nhưng không thể sử dụng được?

EDIT:

Tôi chỉ nhận ra rằng công trình này:

array&& ret3(){ 
    return std::move(sample); 
} 

nay là niềm vui là sự hiểu biết những gì nó thực sự có giá trị ...

+0

có thể trùng lặp của [Array và Rvalue] (http://stackoverflow.com/questions/3656726/array-and-rvalue) –

+0

Thực ra, bằng cách nào đó tôi đã chú ý đến "tham chiếu" trong câu hỏi. Đây không phải là một bản sao cả. –

+0

Một con trỏ rvalue so với con trỏ lvalue - nó phân rã theo một trong hai cách, vậy lợi ích nhận thức ở đây là gì? – ildjarn

Trả lời

3

Vâng, bạn đang đối xử với bạn như là một mảng r giá trị. Bạn có thể nghĩ về nó như một vật thể tạm thời. Bạn có thể sử dụng thông tin này và ghi nhớ rằng nó là an toàn để sửa đổi nội dung của nó. Ví dụ, bạn có thể viết hàm print_sorted(array&) sẽ in nội dung được sắp xếp của mảng đã cho. Để làm điều này, bạn có thể sắp xếp nó trong một số bộ đệm bổ sung, vì bạn không muốn trộn dữ liệu. Nhưng chức năng tương tự với print_sorted(array&&) nguyên mẫu có thể sắp xếp mảng tại chỗ, vì nó biết đối tượng là tạm thời.

Tuy nhiên, tham chiếu giá trị r đối với các đối tượng thuần túy không có dữ liệu động được lưu trữ dường như không hữu ích lắm.

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