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
那么,你的代码适合我.请参阅此示例.
输出:
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是typeT和fisvoid f(T t)- function return:
return a;在一个函数中,例如T f(),其中a是T类型,它有一个移动构造函数.
和
std::move获取其参数的右值引用并将其转换为xvalue.
我认为没有理由你描述的行为.也许您的编译器有问题?
编辑
看来,它确实是编译器的错误.移动功能的定义在提案N3053("定义移动特殊成员功能")中描述.正如我们在此页面上的表格中所示:

| 归档时间: |
|
| 查看次数: |
1357 次 |
| 最近记录: |