Bạn cần thông báo cho C ++ (cụ thể std::vector
) rằng hàm tạo và hủy di chuyển của bạn không ném, sử dụng noexcept
. Sau đó hàm tạo chuyển động sẽ được gọi khi véc tơ lớn lên.
Đây là cách khai báo và triển khai một hằng số di chuyển đượ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 phương thức khởi tạo không phải noexcept
, std::vector
không thể sử dụng nó, vì nó không thể đảm bảo các bảo đảm ngoại lệ theo yêu cầu của tiêu chuẩn.
Để biết thêm về những gì được nói trong tiêu chuẩn, hãy đọc
ngữ nghĩa và ngoại lệ của C ++ Move
Tín dụng cho Bo, người ám chỉ rằng nó có thể phải làm với các trường hợp ngoại lệ. Cũng nên xem xét lời khuyên của Kerrek SB và sử dụng emplace_back
khi có thể. Nó có thể nhanh hơn (nhưng thường thì không), nó có thể rõ ràng 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 hàm tạo 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 rõ ràng điều đó, hãy viết
A(A && rhs) = default;
Làm điều đó, bạn sẽ nhận được noexcept khi có thể: Phương thức khởi tạo Move mặc định có được định nghĩa là noexcept không?
Lưu ý rằng các phiên bản đầu tiên của Visual Studio 2015 trở lên không hỗ trợ điều đó, mặc dù nó hỗ trợ ngữ nghĩa chuyển động.