为什么这个函数不会调用move构造函数?

时间:2014-01-01 09:02:01

标签: c++ c++11

我正在关注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构造函数。但是,当我在第一个函数定义中返回匿名对象时,为什么不会出现这种情况?

1 个答案:

答案 0 :(得分:6)

第一个:RVO - 返回值优化,在调用网站中构建

第二个:复制elision - elide复制/移动和构建到位

第三个:禁止RVO,将对象移出功能