在尝试编写有关移动构造函数的示例后,我遇到了以下代码:
#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
答案 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
类,f
为void f(T t)
- 函数返回:
return a;
在T f()
之类的函数中,其中a是T类型,它有一个移动构造函数。
和
std::move
获取其参数的右值引用,并将其转换为 xvalue 。
我认为你描述的行为没有理由。也许您的编译器出了问题?
修改强>
看来,这确实是编译器的错误。移动函数的定义在提案N3053中描述(&#34;定义移动特殊成员函数&#34;)。我们可以在this page的表格中看到:
答案 1 :(得分:3)
您的代码格式正确,应该调用移动构造函数。但是,gcc 4.4不支持按照here定义移动函数。
您确实想考虑更新编译器。