从C++17开始,拷贝省略是强制性的,它改变了prvalues的工作方式。现在,当返回一个临时值(我知道它实际上不是一个临时值,只是一个初始化器)时,初始化器被传递到调用链的上游,并用于初始化用于存储函数结果的对象。
我的问题是,如何在函数调用链中向上传递初始化器?或者我对这是如何工作的看法是错的?
例如:
struct Foo
{
// some impl...
}
Foo Bar()
{
return Foo{}; // temporary not constructed, prvalue passed up
}
int main()
{
Foo foo = Bar(); // equivalent to Foo foo;
}发布于 2018-12-24 09:35:10
诀窍在于调用约定。
返回值本质上是作为指针传递的,指向函数希望构造返回值的位置。
它一直传递到最内部的函数调用,那里的prvalue直接在最终对象位置构造结果。
当添加guarenteed省略时,标准委员会仔细检查了每个主要编译器都已经在使用这样的调用约定,并且不会发生技术障碍或ABI中断。
上面只包含一些小谎言,但作为一个假设故事,结果是可信的,而且在大多数情况下都是真实的。
重要的是,在描述C++标准的抽象机器中发生了什么,没有传递“返回对象位置的指针”;相反,prvalue必须以某种方式构造最终对象。方法无关紧要。
因此,只要指针不在那里,编译器仍然可以构造对象-如果指针在那里的话。(例如,在寄存器中返回某些类型的对象;对于地址不被获取的普通可复制聚合类型,何时(有时如果)获取其最终位置是不可观察的)。
https://stackoverflow.com/questions/53908003
复制相似问题