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::movekhô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::movebị 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ử CAThỗ trợ chuyển nhượng thường xuyên.
std::movechỉ là một diễn viên, nó không thực sự di chuyển bất cứ điều gì
std::movetự nó không làm gì đối tượng. Người ta có thể tranh luậnstd::movelà được đặt tên kém.