ใน C ++ 11 เราสามารถเขียนโค้ดนี้:
struct Cat {
Cat(){}
};
const Cat cat;
std::move(cat); //this is valid in C++11
เมื่อฉันเรียกstd::moveมันหมายความว่าฉันต้องการย้ายวัตถุกล่าวคือฉันจะเปลี่ยนวัตถุ การย้ายconstวัตถุเป็นเรื่องที่ไม่สมเหตุสมผลเหตุใดจึงstd::moveไม่ จำกัด พฤติกรรมนี้ มันจะเป็นกับดักในอนาคตใช่ไหม?
ที่นี่หมายถึงกับดักตามที่ Brandon กล่าวไว้ในความคิดเห็น:
"ฉันคิดว่าเขาหมายถึงมัน" กับดัก "เขาส่อเสียดส่อเสียดเพราะถ้าเขาไม่รู้ตัวเขาก็จบลงด้วยการลอกเลียนแบบซึ่งไม่ใช่สิ่งที่เขาตั้งใจไว้"
ในหนังสือ 'Effective Modern C ++' โดย Scott Meyers เขายกตัวอย่าง:
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;
};
หากstd::moveถูกห้ามไม่ให้ใช้งานกับconstวัตถุเราสามารถค้นหาจุดบกพร่องได้อย่างง่ายดายใช่ไหม?
CAT cat2 = std::move(cat);สมมติว่าCATรองรับการมอบหมายการย้ายตามปกติ
std::moveเป็นเพียงนักแสดง แต่ไม่ได้เคลื่อนไหวอะไรเลย
std::moveโดยตัวมันเองไม่ได้ทำอะไรกับวัตถุ อาจมีคนโต้แย้งstd::moveคือชื่อไม่ดี