C++ 为什么移动构造函数需要使用;右值引用“;?

C++ 为什么移动构造函数需要使用;右值引用“;?,c++,c++11,constructor,move-constructor,C++,C++11,Constructor,Move Constructor,例如,以下移动构造函数在没有&&(右值引用)的情况下工作: 我真的不明白为什么有必要…您的示例无法绑定到临时文件,因此这些文件不起作用: Obj makeObj() { return Obj(); } Obj o1(Obj()); // Error Obj o2(makeObj()); // Error 此外,它还使破坏东西变得非常容易,因为实际上您有一个复制构造函数,它从复制对象窃取状态: Obj o1; Obj o2{o1}; // o1 is modified 右值引用参数将

例如,以下移动构造函数在没有
&&
(右值引用)的情况下工作:


我真的不明白为什么有必要…

您的示例无法绑定到临时文件,因此这些文件不起作用:

Obj makeObj() { return Obj(); }

Obj o1(Obj());     // Error
Obj o2(makeObj()); // Error
此外,它还使破坏东西变得非常容易,因为实际上您有一个复制构造函数,它从复制对象窃取状态:

Obj o1;
Obj o2{o1}; // o1 is modified

右值引用参数将拒绝绑定到非右值引用。由于此限制,
move
操作只有在以后无法在代码中明确引用要从中移动的对象时才会发生(因为它是一个被丢弃的临时变量,或者是一个被返回的局部变量),或者因为调用方显式地
move
d

要了解为什么需要这样做,您可以查看
auto_ptr
的历史记录,也可以阅读此示例,该示例使用您的
Obj
类型:

int main() {
  Obj a;
  Obj b = a; // oops!  You just *moved* a into b!
}
使用适当的
move
构造函数,只有当右边是一个将被立即丢弃的值(编译器可以检测到),或者您调用
move
时,才会调用它


最重要的是,
&
引用拒绝绑定到临时对象——临时对象只能绑定到一个
常量&
或一个不属于move构造函数的
&

。这是一个复制构造函数,也是一个糟糕的构造函数。这是一个复制构造函数。纳瓦兹跑得更快:P.Bah,忘了提这个。公然窃取你的答案!我看你也帮了我一个忙@也许看起来是这样,但我忙于打字,什么都没注意到:)因为我无法知道谁剽窃了谁,所以我给了你们两个一分-vote@JoshG79我忘了在我的回答中包括“哦,它不适用于临时工”部分,这是juan开始的部分。(当我意识到我忘记了那一部分后,我编辑了答案的最后一段!)
int main() {
  Obj a;
  Obj b = a; // oops!  You just *moved* a into b!
}