首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从函数返回prvalue

从函数返回prvalue
EN

Stack Overflow用户
提问于 2018-12-24 07:40:54
回答 1查看 91关注 0票数 1

从C++17开始,拷贝省略是强制性的,它改变了prvalues的工作方式。现在,当返回一个临时值(我知道它实际上不是一个临时值,只是一个初始化器)时,初始化器被传递到调用链的上游,并用于初始化用于存储函数结果的对象。

我的问题是,如何在函数调用链中向上传递初始化器?或者我对这是如何工作的看法是错的?

例如:

代码语言:javascript
复制
struct Foo
{
  // some impl...
}

Foo Bar()
{
  return Foo{}; // temporary not constructed, prvalue passed up
}

int main()
{
  Foo foo = Bar(); // equivalent to Foo foo; 
}
EN

回答 1

Stack Overflow用户

发布于 2018-12-24 09:35:10

诀窍在于调用约定。

返回值本质上是作为指针传递的,指向函数希望构造返回值的位置。

它一直传递到最内部的函数调用,那里的prvalue直接在最终对象位置构造结果。

当添加guarenteed省略时,标准委员会仔细检查了每个主要编译器都已经在使用这样的调用约定,并且不会发生技术障碍或ABI中断。

上面只包含一些小谎言,但作为一个假设故事,结果是可信的,而且在大多数情况下都是真实的。

重要的是,在描述C++标准的抽象机器中发生了什么,没有传递“返回对象位置的指针”;相反,prvalue必须以某种方式构造最终对象。方法无关紧要。

因此,只要指针不在那里,编译器仍然可以构造对象-如果指针在那里的话。(例如,在寄存器中返回某些类型的对象;对于地址不被获取的普通可复制聚合类型,何时(有时如果)获取其最终位置是不可观察的)。

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

https://stackoverflow.com/questions/53908003

复制
相关文章

相似问题

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