移动未调用的构造函数

use*_*860 7 c++ move copy-constructor move-semantics c++11

在尝试编写有关移动构造函数的示例后,我遇到了以下代码:

#include <utility>
#include <iostream>

using namespace std;

class Data
{
public:
    Data()
    : x (3)
    {
        cout << "Data()" << endl;
    }
    Data(Data&&)
    : x(4)
    {
        cout << "Data(&&)" << endl;
    }

int x;
};

int main()
{
    Data a;
    Data b (std::move(a));
    cout << b.x << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么移动构造函数不在这里调用?程序打印:

数据()

3

我发现甚至更奇怪的是,通过添加一个复制构造函数,突然,它确实调用了移动构造函数...

    Data(const Data&)
    : x(2)
    {
        cout << "Data(copy)" << endl;
    }
Run Code Online (Sandbox Code Playgroud)

现在它将打印出来

数据(&&)

4

PS我正在使用gcc 4.4.5

Mat*_*jek 9

那么,你的代码适合我.请参阅此示例.

输出:

Data()
Data(&&)
4
Run Code Online (Sandbox Code Playgroud)

标准说:

只要从相同类型的xvalue初始化对象,就会调用移动构造函数 ,其中包括

  • 初始化,T a = std::move(b);或者T a(std::move(b));,b类型T
  • 函数参数传递:f(std::move(a));,其中a是type Tfisvoid f(T t)
  • function return:return a;在一个函数中,例如T f(),其中a是T类型,它有一个移动构造函数.

std::move获取其参数的右值引用并将其转换为xvalue.

我认为没有理由你描述的行为.也许您的编译器有问题?


编辑

看来,它确实是编译器的错误.移动功能的定义在提案N3053("定义移动特殊成员功能")中描述.正如我们在此页面上的表格中所示:

在此输入图像描述