gpt4 book ai didi

c++ - 从函数返回值

转载 作者:行者123 更新时间:2023-11-30 02:17:13 26 4
gpt4 key购买 nike

自 C++17 起,复制省略是强制性的,它改变了纯右值的工作方式。现在,当返回一个临时对象(我知道它不是真正的临时对象,只是一个初始化器)时,初始化器被传递到调用链并用于初始化用于存储函数结果的对象。

我的问题是,如何将初始化器传递到函数调用链中?还是我对它的工作原理有误?

例如:

struct Foo
{
// some impl...
}

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

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

最佳答案

诀窍在于调用约定。

返回值本质上是作为指针传递到函数想要构造返回值的位置。

这一直传递到最内层的函数调用,那里的纯右值直接在结束对象位置构造结果。

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

以上仅包含一些小谎言,但作为一个假设故事,结果似乎是合理的,并且在大多数方面都是真实的。

重要的谎言是,在描述C++标准所使用的抽象机中发生的事情,没有传递“返回对象位置的指针”;相反,纯右值必须以某种方式 构造最终对象。 如何并不重要。

因此,无论何时指针不存在,编译器仍然可以构造对象,就像指针存在一样。 (例如,返回寄存器中的某些类型的对象;对于其地址未被获取的普通可复制聚合类型,它何时(有时是否)获取其最终位置是不可观察的。

关于c++ - 从函数返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53908003/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com