我正在关注Stephan T. Lavavej的视频讲座,即关于移动语义的视频讲座:http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-9-of-n
在讲座中,Stephan给出了一个名为remote_integer的示例类,并定义了一个全局函数,如下所示:
remote_integer square(const remote_integer &r) {
const int i = r.get();
return remote_integer(i*i);
}
类remote_integer包含一个移动构造函数,但是,我注意到在尝试初始化一个新对象时调用函数square时,移动构造函数不能按预期工作。
以下是代码:
remote_integer a(8);
// Expect move constructor to be called
remote_integer b = square(a);
当我按如下方式更改square的函数定义时,move构造函数按预期工作。
remote_integer square(const remote_integer &r) {
const int i = r.get();
remote_integer local(i*i);
return local;
}
为什么在第二种情况下调用移动构造函数,而不是在第一种情况下调用?显然在修改后的square函数中,remote_integer本地是函数的作用域,因此很明显在返回变量local时调用move构造函数。但是,当我在第一个函数定义中返回匿名对象时,为什么不会出现这种情况?
答案 0 :(得分:6)
第一个:RVO - 返回值优化,在调用网站中构建
第二个:复制elision - elide复制/移动和构建到位
第三个:禁止RVO,将对象移出功能