gpt4 book ai didi

c++ - 保证复制省略是否适用于函数参数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:06 24 4
gpt4 key购买 nike

如果我理解正确的话,从 C++17 开始,这段代码现在要求不进行复制:

Foo myfunc(void) {
return Foo();
}

auto foo = myfunc(); // no copy

函数参数也是如此吗?以下代码中是否会优化拷贝?

Foo myfunc(Foo foo) {
return foo;
}

auto foo = myfunc(Foo()); // will there be copies?

最佳答案

在 C++17 中,纯右值(“匿名临时对象”)不再是对象。相反,它们是关于如何构造对象的说明。

他们可以根据构造指令实例化一个临时对象,但是由于那里没有对象,因此没有复制/移动构造可以省略。

Foo myfunc(Foo foo) {
return foo;
}

所以在这里,函数参数foo被移动到myfunc的纯右值返回值中。您可以在概念上将其视为“myfunc 返回有关如何制作 Foo 的说明”。如果您的程序“未使用”这些指令,则会自动实例化一个临时指令并使用这些指令。

(顺便说一句,说明包括时间旅行规定;构建的时间点保留在函数本身内!)

auto foo = myfunc(Foo());

所以在这里,Foo() 是一个纯右值。它说“使用 () 构造函数构造一个 Foo”。然后用它来构造 myfunc 的参数。没有省略,没有复制构造函数或移动构造函数被调用,只是 ()

然后事情发生在 myfunc 中。

myfunc 返回类型为 Foo 的纯右值。此纯右值(也称为构造指令)用于构造局部变量 auto foo

所以这里发生的是 Foo 是通过 () 构造的,然后移动到 auto foo

据我所知,C++14 和 C++17 都不支持将函数参数省略为返回值(我可能是错的,我这里没有标准的章节)。但是,当在 return func_arg; 上下文中使用时,它们会被隐式移动。

关于c++ - 保证复制省略是否适用于函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44246634/

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