3

可能重复:
移动构造函数签名

struct X
{
    X(X&);         // (1)
    X(X&&);        // (2)
    X(const X&);   // (3)
    X(const X&&);  // (4)
};

是否有任何情况(4)会在重载解决方案中被选中?

4

2 回答 2

9

是的。一种情况是当你有一个带有const返回值的函数时:

const X f();

X x(f());
于 2012-12-31T10:58:56.077 回答
2

另一种情况是当您应用于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对象。

于 2012-12-31T12:32:01.227 回答