Bạn cần thông báo cho C++ (cụ thể là std::vector
) rằng hàm khởi tạo và hủy của bạn không ném, sử dụng noexcept
. Sau đó, hàm tạo di chuyển sẽ được gọi khi vector phát triển.
Đây là cách khai báo và thực hiện một constuctor di chuyển mà được tôn trọng bởi std::vector
:
A(A && rhs) noexcept {
std::cout << "i am the move constr" <<std::endl;
... some code doing the move ...
m_value=std::move(rhs.m_value) ; // etc...
}
Nếu các nhà xây dựng không phải là noexcept
, std::vector
không thể sử dụng nó, kể từ đó nó không thể đảm bảo sự ngoại lệ đảm bảo theo yêu cầu của tiêu chuẩn.
Để biết thêm về những gì đã nói trong tiêu chuẩn, đọc C++ Move semantics and Exceptions
tín dụng đối với Bo người ám chỉ rằng nó có thể có để làm với trường hợp ngoại lệ. Cũng xem xét lời khuyên của Kerrek SB và sử dụng emplace_back
khi có thể. Nó có thể được nhanh hơn (nhưng thường không phải là), nó có thể rõ ràng hơn và nhỏ gọn hơn, nhưng cũng có một số cạm bẫy (đặc biệt là với các nhà thầu không rõ ràng).
Chỉnh sửa, thường mặc định là những gì bạn muốn: di chuyển mọi thứ có thể di chuyển, sao chép phần còn lại. Để yêu cầu một cách rõ ràng cho điều đó, hãy viết
A(A && rhs) = default;
Làm như vậy, bạn sẽ nhận được noexcept khi có thể: Is the default Move constructor defined as noexcept?
Lưu ý rằng phiên bản đầu tiên của Visual Studio 2015 và cũ không hỗ trợ đó, mặc dù nó hỗ trợ chuyển ngữ nghĩa .
Nguồn
2012-01-14 19:50:00
Bạn có thể, bằng cách sử dụng triển khai thực hiện vector di chuyển. –
Bạn có thể vui lòng biết thêm một chút về cách thực hiện điều này không? –
Bạn chỉ cần sử dụng triển khai thực hiện vector di chuyển. Có vẻ như việc thực hiện thư viện chuẩn của bạn (tức là btw?) Không di chuyển. Bạn có thể thử với các thùng chứa nhận biết di chuyển từ Boost. –