Nếu tôi move
shared_ptr
'a' vào shared_ptr
'b' là 'a' được bảo đảm là rỗng?Trạng thái của bất kỳ lớp tiêu chuẩn nào sau khi được di chuyển được chỉ định?
Trạng thái của bất kỳ lớp nào là tiêu chuẩn sau khi được di chuyển được chỉ định?
Nếu tôi move
shared_ptr
'a' vào shared_ptr
'b' là 'a' được bảo đảm là rỗng?Trạng thái của bất kỳ lớp tiêu chuẩn nào sau khi được di chuyển được chỉ định?
Trạng thái của bất kỳ lớp nào là tiêu chuẩn sau khi được di chuyển được chỉ định?
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.
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ảnshared_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.
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 ... –
@Matthieu: Có vẻ như bạn cần TCO. ; -] – ildjarn
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
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). –