我正在观看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包含一个移动构造函数,但是我注意到,当函数平方在尝试初始化一个新对象时被调用时,移动构造函数不按预期工作。
下面是代码:
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;
}为什么在第二种情况下调用移动构造函数,而在第一种情况下没有调用?显然,在修改后的平方函数中,remote_integer是局部的--函数的作用域,所以很明显,在返回变量局部变量时调用了移动构造函数。但是,为什么像第一个函数定义中那样返回匿名对象时不会发生这种情况呢?
发布于 2014-01-01 09:03:24
First one:RVO -返回值优化,在调用站点中构造
第二:复制省略- elide复制/移动和构造到位
第三:抑制RVO,将对象移出函数
https://stackoverflow.com/questions/20867063
复制相似问题