首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个函数不调用移动构造函数?

为什么这个函数不调用移动构造函数?
EN

Stack Overflow用户
提问于 2014-01-01 09:02:00
回答 1查看 148关注 0票数 1

我正在观看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的示例类,并将全局函数定义如下:

代码语言:javascript
复制
remote_integer square(const remote_integer &r) {
  const int i = r.get();
  return remote_integer(i*i);
}

然而,类remote_integer包含一个移动构造函数,但是我注意到,当函数平方在尝试初始化一个新对象时被调用时,移动构造函数不按预期工作。

下面是代码:

代码语言:javascript
复制
  remote_integer a(8);
  // Expect move constructor to be called
  remote_integer b = square(a);

当我按如下方式更改square的函数定义时,move构造函数确实按预期工作。

代码语言:javascript
复制
remote_integer square(const remote_integer &r) {
  const int i = r.get();
  remote_integer local(i*i);
  return local;
}

为什么在第二种情况下调用移动构造函数,而在第一种情况下没有调用?显然,在修改后的平方函数中,remote_integer是局部的--函数的作用域,所以很明显,在返回变量局部变量时调用了移动构造函数。但是,为什么像第一个函数定义中那样返回匿名对象时不会发生这种情况呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-01 09:03:24

First one:RVO -返回值优化,在调用站点中构造

第二:复制省略- elide复制/移动和构造到位

第三:抑制RVO,将对象移出函数

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20867063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档