Trong C++ 11, chúng ta có thể viết mã này:Tại sao chúng ta có thể sử dụng `std :: move` trên đối tượng` const`?
struct Cat {
Cat(){}
};
const Cat cat;
std::move(cat); //this is valid in C++11
khi tôi gọi std::move
, nó có nghĩa là tôi muốn di chuyển đối tượng, ví dụ: Tôi sẽ thay đổi đối tượng. Để di chuyển đối tượng const
là không hợp lý, vậy tại sao std::move
không hạn chế hành vi này? Nó sẽ là một cái bẫy trong tương lai, phải không?
Đây bẫy nghĩa như Brandon đề cập trong các bình luận:
"Tôi nghĩ anh ấy có nghĩa là nó 'bẫy' anh ấy lén lút lén lút vì nếu anh ta không nhận ra, ông kết thúc với một bản sao mà không phải là những gì ông dự định.
Trong cuốn sách 'Effective Modern C++' Scott Meyers, ông đưa ra một ví dụ:
class Annotation {
public:
explicit Annotation(const std::string text)
: value(std::move(text)) //here we want to call string(string&&),
//but because text is const,
//the return type of std::move(text) is const std::string&&
//so we actually called string(const string&)
//it is a bug which is very hard to find out
private:
std::string value;
};
Nếu std::move
bị cấm từ hoạt động trên một đối tượng const
, chúng ta có thể dễ dàng tìm ra các lỗi, phải không ?
Nhưng hãy thử di chuyển. Cố gắng thay đổi trạng thái của nó. 'std :: move' tự nó không làm gì với đối tượng. Người ta có thể tranh cãi 'std :: move' được đặt tên kém. – juanchopanza
Nó không thực sự * di chuyển * bất cứ điều gì. Tất cả nó được đúc thành một tham chiếu rvalue. thử 'CAT cat2 = std :: move (cat);', giả sử 'CAT' hỗ trợ chuyển động thường xuyên. – WhozCraig
'std :: move' chỉ là một diễn viên, nó không thực sự di chuyển bất cứ điều gì –