移动未调用的构造函数

时间:2015-04-20 12:09:03

标签: c++ c++11 move copy-constructor move-semantics

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

#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;
}

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

  

数据()

     

3

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

    Data(const Data&)
    : x(2)
    {
        cout << "Data(copy)" << endl;
    }

现在它将打印

  

数据(&安培;&安培;)

     

4

P.S我正在使用gcc 4.4.5

2 个答案:

答案 0 :(得分:9)

嗯,您的代码适合我。 See this sample

输出:

Data()
Data(&&)
4

正如标准所说:

  

每当初始化对象时都会调用move构造函数   相同类型的 xvalue ,包括

     
      
  • 初始化,T a = std::move(b);T a(std::move(b));,其中b的类型为T
  •   
  • 函数参数传递:f(std::move(a));,其中a为T类,fvoid f(T t)
  •   
  • 函数返回:return a;T f()之类的函数中,其中a是T类型,它有一个移动构造函数。
  •   

  

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

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


修改

看来,这确实是编译器的错误。移动函数的定义在提案N3053中描述(&#34;定义移动特殊成员函数&#34;)。我们可以在this page的表格中看到:

enter image description here

答案 1 :(得分:3)

您的代码格式正确,应该调用移动构造函数。但是,gcc 4.4不支持按照here定义移动函数。

您确实想考虑更新编译器。