ฉันเพิ่งพบว่าตัวเองไม่เข้าใจตรรกะของstd::move()
.
ตอนแรกฉันใช้ googled แต่ดูเหมือนว่าจะมีเพียงเอกสารเกี่ยวกับวิธีใช้std::move()
ไม่ใช่วิธีการทำงานของโครงสร้าง
ฉันหมายความว่าฉันรู้ว่าฟังก์ชันสมาชิกเทมเพลตคืออะไร แต่เมื่อฉันดูstd::move()
คำจำกัดความใน VS2010 ก็ยังสับสน
คำจำกัดความของ std :: move () อยู่ด้านล่าง
template<class _Ty> inline
typename tr1::_Remove_reference<_Ty>::_Type&&
move(_Ty&& _Arg)
{ // forward _Arg as movable
return ((typename tr1::_Remove_reference<_Ty>::_Type&&)_Arg);
}
สิ่งที่แปลกก่อนสำหรับฉันคือพารามิเตอร์ (_Ty && _Arg) เพราะเมื่อฉันเรียกใช้ฟังก์ชันอย่างที่คุณเห็นด้านล่าง
// main()
Object obj1;
Object obj2 = std::move(obj1);
โดยพื้นฐานแล้วมันเท่ากับ
// std::move()
_Ty&& _Arg = Obj1;
แต่อย่างที่คุณทราบแล้วคุณไม่สามารถเชื่อมโยง LValue กับข้อมูลอ้างอิง RValue ได้โดยตรงซึ่งทำให้ฉันคิดว่ามันควรจะเป็นแบบนี้
_Ty&& _Arg = (Object&&)obj1;
อย่างไรก็ตามนี่เป็นเรื่องที่ไร้สาระเนื่องจาก std :: move () ต้องใช้ได้กับค่าทั้งหมด
ดังนั้นฉันเดาว่าจะเข้าใจอย่างถ่องแท้ว่ามันทำงานอย่างไรฉันควรดูโครงสร้างเหล่านี้ด้วย
template<class _Ty>
struct _Remove_reference
{ // remove reference
typedef _Ty _Type;
};
template<class _Ty>
struct _Remove_reference<_Ty&>
{ // remove reference
typedef _Ty _Type;
};
template<class _Ty>
struct _Remove_reference<_Ty&&>
{ // remove rvalue reference
typedef _Ty _Type;
};
น่าเสียดายที่มันยังสับสนและฉันไม่เข้าใจ
ฉันรู้ว่าทั้งหมดนี้เป็นเพราะฉันไม่มีทักษะพื้นฐานทางไวยากรณ์เกี่ยวกับ C ++ ฉันต้องการทราบวิธีการทำงานอย่างละเอียดและเอกสารใด ๆ ที่ฉันสามารถหาได้ทางอินเทอร์เน็ตจะยินดีเป็นอย่างยิ่ง (ถ้าอธิบายได้แค่นี้ก็น่าจะยอดเยี่ยมเช่นกัน)