Trong C ++ 11, chúng ta có thể viết mã này:
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, tức là tôi sẽ thay đổi đối tượng. Để di chuyển một const
đối tượng 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 cái bẫy có nghĩa như Brandon đã đề cập trong bình luận:
"Tôi nghĩ ý anh ta là nó" gài bẫy "anh ta một cách lén lút vì nếu anh ta không nhận ra, anh ta sẽ nhận được một bản sao không phải như ý định của anh ta."
Trong cuốn sách 'C ++ hiện đại hiệu quả' của 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 hoạt động trên một const
đối tượng, chúng ta có thể dễ dàng tìm ra lỗi, phải không?
CAT cat2 = std::move(cat);
, giả sử CAT
hỗ trợ chuyển nhượng thường xuyên.
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ì
std::move
tự nó không làm gì đối tượng. Người ta có thể tranh luậnstd::move
là được đặt tên kém.