2011-12-15 12 views

Trả lời

12

Nói chung 17.6.5.15/1 áp dụng:

Đối tượng của các loại quy định tại thư viện chuẩn C++ có thể được di chuyển từ (12,8). Các thao tác di chuyển có thể được chỉ định rõ ràng hoặc được tạo ngầm. Trừ khi có quy định khác, các đối tượng chuyển từ đó phải được đặt ở trạng thái hợp lệ nhưng không xác định.

Vì vậy, bạn có thể gọi bất kỳ chức năng nào không yêu cầu điều kiện tiên quyết.

Nếu được chỉ định, what @Xeo said sẽ áp dụng.

+0

Tôi đã tham chiếu chéo các câu trả lời của mình, cả hai chúng tôi đã thêm một phần của câu trả lời hoàn chỉnh. :) – Xeo

+0

Sau khi di chuyển, tốt nhất là để cho vật thể cũ rơi ra khỏi phạm vi hoặc rõ ràng khởi tạo lại nó trước khi sử dụng lại. Dựa vào một phương pháp không có tiền điều kiện sẽ trở thành một vấn đề bảo trì (người đàn ông cầm rìu). –

13

Nếu được chỉ định, đó là theo hàm tạo và (nếu có thể gán) toán tử gán điều khoản. Đối với shared_ptr ta có:

§20.7.2.2.1 [util.smartptr.shared.const]

shared_ptr(shared_ptr&& r) noexcept; 
template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept; 

P20 Ghi chú: Các constructor thứ hai sẽ không tham gia vào giải quyết tình trạng quá tải trừ khi Y* là mui trần để T*.
p21 Hiệu ứng: Di chuyển-xây dựng một phiên bản shared_ptr từ r.
p22 Điều kiện sau:*this phải chứa giá trị cũ là r. r phải là trống. r.get() == 0.

Các nhà khai thác giao shared_ptr về cơ bản mô tả bằng cách sao chép-và-swap với một tạm thời được xây dựng từ (di chuyển nếu rvalue) lập luận:

§20.7.2.2.3 [util.smartptr.shared.assign]

shared_ptr& operator=(shared_ptr&& r) noexcept; 
template<class Y> shared_ptr& operator=(shared_ptr<Y>&& r) noexcept; 

p4 Hiệu ứng : Tương đương với shared_ptr(std::move(r)).swap(*this).
p5 Trả lại:*this.

Nếu không được chỉ định, what @AProgrammer said sẽ áp dụng.

+4

Tôi bị cuốn vào ngăn xếp ngăn xếp sau tham chiếu của bài đăng này ... –

+2

@Matthieu: Có vẻ như bạn cần TCO. ; -] – ildjarn

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