unique_ptr<T>
không cho phép xây dựng bản sao, thay vào đó nó hỗ trợ di chuyển ngữ nghĩa. Tuy nhiên, tôi có thể trả về a unique_ptr<T>
từ một hàm và gán giá trị được trả về cho một biến.
#include <iostream>
#include <memory>
using namespace std;
unique_ptr<int> foo()
{
unique_ptr<int> p( new int(10) );
return p; // 1
//return move( p ); // 2
}
int main()
{
unique_ptr<int> p = foo();
cout << *p << endl;
return 0;
}
Các mã trên biên dịch và hoạt động như dự định. Vậy làm thế nào mà dòng 1
đó không gọi được hàm tạo sao chép và dẫn đến lỗi trình biên dịch? Nếu tôi phải sử dụng dòng 2
thay vì nó sẽ có ý nghĩa (sử dụng dòng cũng 2
hoạt động, nhưng chúng tôi không bắt buộc phải làm như vậy).
Tôi biết C ++ 0x cho phép ngoại lệ này unique_ptr
vì giá trị trả về là một đối tượng tạm thời sẽ bị hủy ngay khi hàm thoát, do đó đảm bảo tính duy nhất của con trỏ được trả về. Tôi tò mò về cách thực hiện điều này, nó có đặc biệt trong trình biên dịch hay có một số mệnh đề khác trong đặc tả ngôn ngữ mà điều này khai thác không?
unique_ptr
. Toàn bộ câu hỏi là về 1 và 2 là hai cách khác nhau để đạt được cùng một điều.
main
thoát khỏi chức năng, nhưng không xảy ra khi foo
thoát.