可能重复:
移动构造函数签名
struct X
{
X(X&); // (1)
X(X&&); // (2)
X(const X&); // (3)
X(const X&&); // (4)
};
是否有任何情况(4)
会在重载解决方案中被选中?
是的。一种情况是当你有一个带有const
返回值的函数时:
const X f();
X x(f());
另一种情况是当您应用于std::move
对象const
时,如下例所示:
#include <iostream>
using namespace std;
struct X
{
X() { cout << "default" << endl; }
X(X&) { cout << "non const copy" << endl; } // (1)
X(X&&) { cout << "non const move" << endl; } // (2)
X(const X&) { cout << "const copy" << endl; } // (3)
X(const X&&){ cout << "const move" << endl; } // (4)
};
void f(X const x)
{
}
int main()
{
X const x;
f(std::move(x));
return 0;
}
X const f()
上一个答案(
将一个对象作为逻辑操作const
移动到另一个const
对象中确实有意义,如果您没有定义移动构造函数,那么您将不被允许这样做。搬家只是转移所有权,所以在我看来,作为一种合乎逻辑的操作,它应该得到支持。const
尽管从高级的角度来看,您不应该修改const
对象并且确实移动对象需要修改它(在大多数情况下),但在众所周知的类似情况下,可以在const
“后面”修改对象场景”,以实现更高层次的概念操作。例如const
,需要锁定非常量成员互斥锁的成员函数:您可以将互斥锁变量声明为mutable
将其视为非常量对象。
因此,即使在这种情况下,我也将其视为const
移动构造函数中的合法操作(只要需要),以修改mutable
移动对象的成员(可能是对象的析构函数要检查的一些布尔标志)。请注意,如果您const
从上面的代码中删除构造函数 (3) 和 (4),那么它将无法编译。如果只删除 (4),将选择复制构造函数 (3) - 这意味着您将无法移动const
对象。