ใน 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
คือชื่อไม่ดี