2013-06-03 28 views
5

Trong khi đọc về tăng unique_ptr và trên link nó nói rằng một con trỏ như vậy không thể được sao chép mà tôi hiểu tuy nhiên nó nói rằng một con trỏ như vậy có thể được trả về từ một hàm. Điều này đặt ra một câu hỏi trong tâm trí của tôi khi một cái gì đó được trả về từ một hàm (không phải là một tham chiếu hoặc một con trỏ). như vậy mà chỉ ptr điểm đến một đối tượng tại một thời điểm) Ngoài ra hiện nó có ít hơn một chi phí hơn so với tăng một shared_ptr? Tôi đang sử dụng VS2010Trả lại một unique_ptr <T>. Làm rõ khái niệm

+1

"Tuy nhiên, unique_ptr có thể được di chuyển bằng cách sử dụng ngữ nghĩa di chuyển mới". Bạn nên xem xét các tham chiếu rvalue nói chung và di chuyển ngữ nghĩa nói riêng. – Dave

+0

có thể trùng lặp của [Quay trở lại duy nhất \ _ptr từ chức năng] (http://stackoverflow.com/questions/4316727/returning-unique-ptr-from-functions) – Praetorian

Trả lời

13

khi một cái gì đó được trả về từ một hàm (không phải là tham chiếu hoặc con trỏ) thì hàm tạo bản sao được gọi. [...]

Không nhất thiết. Trong C++ 11, hàm tạo bản sao chỉ được chọn nếu một hàm tạo di chuyển không có. Trong trường hợp không có một hàm tạo di chuyển, thông thường sẽ là một động thái (ví dụ: khi trở về theo giá trị từ một hàm) phân rã thành một bản sao.

unique_ptr có một hàm tạo di chuyển, có nghĩa là một unique_ptr có thể được trả về theo giá trị từ một hàm.

Nó cũng có ít chi phí hơn là tăng shared_ptr?

Đó là một câu hỏi không liên quan, nhưng có, nó có ít chi phí hơn. Thực tế, unique_ptr được thiết kế để là số không trên Trình bao bọc RAII của một con trỏ thô nhận ra quyền sở hữu duy nhất. Sử dụng unique_ptr không gây ra bất kỳ tổn thất nào về hiệu suất cũng như về mức tiêu thụ bộ nhớ liên quan đến việc sử dụng con trỏ thô.

+0

Điều gì về trong C++ 0x – MistyD

+0

Phần thứ hai là hoàn hảo. Bạn có thể giải thích phần đầu tiên về C++ 0x – MistyD

+0

@MistyD: Không có "C++ 0x". C++ 0x là tên C++ 11 trước khi nó được biết rằng tiêu chuẩn sẽ được hoàn thành vào năm 2011 –