未调用移动构造函数

Move constructor not called

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

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

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

Data()

3

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

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

现在它将打印

Data(&&)

4

P.S 我正在使用 gcc 4.4.5

好吧,你的代码对我来说工作正常。 See this sample.

输出:

Data()
Data(&&)
4

如标准所说:

The move constructor is called whenever an object is initialized from xvalue of the same type, which includes

  • initialization, T a = std::move(b); or T a(std::move(b));, where b is of type T
  • function argument passing: f(std::move(a));, where a is of type T and f is void f(T t)
  • function return: return a; inside a function such as T f(), where a is of type T which has a move constructor.

std::move obtains an rvalue reference to its argument and converts it to an xvalue.

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


编辑

看来,确实是编译器的问题。提案 N3053 ("Defining Move Special Member Functions"). As we can see in table on this page:

中描述了移动函数的定义

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

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