7

Tại sao tôi không thể trả lại giá trị unique_ptr từ một cặp?Tại sao tôi không thể trả lại một unique_ptr từ một cặp?

#include <iostream> 
#include <memory> 
#include <utility> 

using namespace std; 

unique_ptr<int> get_value() { 
    pair<unique_ptr<int>, int> p(unique_ptr<int>(new int(3)), 4); 
    return p.first; 
} 

int main(void) { 
    cout << *get_value() << endl; 
    return 0; 
} 

Khi tôi cố gắng biên dịch này với g ++ 4.6, tôi nhận được:

../main.cpp: In function ‘std::unique_ptr<int> get_value()’: 
../main.cpp:9:11: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int, _Dp = std::default_delete<int>, std::unique_ptr<_Tp, _Dp> = std::unique_ptr<int>]’ 
/usr/include/c++/4.6/bits/unique_ptr.h:256:7: error: declared here 
make: *** [main.o] Error 1 

Tôi không hiểu được thông báo lỗi

+1

'std :: unique_ptr' là chỉ di chuyển. – chris

+0

cách này không chỉ di chuyển? – dspyz

Trả lời

9

std::unique_ptr không có một constructor sao chép, và đường đi trong đó bạn đang trả lại nó (như một thành viên của một đối tượng địa phương) không đủ điều kiện để di chuyển tự động. Bạn cần xác định di chuyển theo cách thủ công trong trường hợp này.

return std::move(p.first); 
+0

Làm cách nào để biết điều gì đủ điều kiện để di chuyển tự động? – dspyz

+1

@dspyz: Hãy cho tôi một phút để tra cứu tham chiếu, nhưng đó là các điều kiện tương tự đủ điều kiện để tối ưu hóa giá trị trả về. –

+6

@dspyz: Kiểm tra 12.8 đoạn 31 và 32: http://isocpp.org/files/papers/N3797.pdf –

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