在尝试编写有关移动构造函数的示例之后,我遇到了以下代码:
#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;
}
为什么在这里未调用move构造函数?程序打印:
数据()
3
我发现甚至更奇怪的是,通过添加复制构造函数,突然,它确实调用了移动构造函数...
Data(const Data&)
: x(2)
{
cout << "Data(copy)" << endl;
}
现在它将打印
数据(&&)
4
PS我正在使用GCC 4.4.5
好吧,您的代码对我来说正常工作。请参阅此示例。
输出:
Data()
Data(&&)
4
按照标准说:
每当从相同类型的xvalue初始化对象时,都会调用move构造函数,其中包括
- 初始化,
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(“定义移动特殊成员功能”)描述了移动功能的定义。正如我们在此页的表中所看到的:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句