【发布时间】:2016-06-02 14:17:44
【问题描述】:
看看这段代码:
class Foo
{
public:
string name;
Foo(string n) : name{n}
{
cout << "CTOR (" << name << ")" << endl;
}
Foo(Foo&& moved)
{
cout << "MOVE CTOR (moving " << moved.name << " into -> " << name << ")" << endl;
name = moved.name + " ###";
}
~Foo()
{
cout << "DTOR of " << name << endl;
}
};
Foo f()
{
return Foo("Hello");
}
int main()
{
Foo myObject = f();
cout << endl << endl;
cout << "NOW myObject IS EQUAL TO: " << myObject.name;
cout << endl << endl;
return 0;
}
输出是:
[1] CTOR(你好)
[2] MOVE CTOR(将 Hello 移入 -> )
[3] DTOR 的 Hello
[4] MOVE CTOR(将 Hello ### 移动到 ->)
[5] DTOR of Hello ###
[6] 现在两个等于:你好### ###
[7] DTOR of Hello ### ###
重要提示:出于测试目的,我已使用 -fno-elide-constructors 禁用复制省略优化。
函数 f() 构造一个临时 [1] 并返回它调用移动构造函数将资源从该临时“移动”到 myObject [2] (另外,它添加了 3 # 个符号)。
最终,临时对象被销毁[3]。
我现在希望 myObject 完全构造,并且它的 name 属性是 Hello ###。
相反,移动构造函数被再次调用,所以我只剩下 Hello ### ###
【问题讨论】:
-
1)
return语句的操作数移入返回值,2) 返回值移入myObject。 -
另一个移动是从
f()到myObject,因为复制省略被禁用。
标签: c++ c++11 move move-semantics move-constructor