为什么在按值返回时创建临时对象,而不是在按值传递给函数参数时创建临时对象

why temporary object gets created while returning by value not while passing by value to function parameter

本文关键字:创建 临时对象 按值传递 函数 参数 返回 为什么      更新时间:2023-10-16

原型:

class A;
A func(A obj2)
{
return obj2;
};
int main()
{
A obj1;
A obj3 = func(obj1);
return 0;
}

在按值将参数传递给函数时,它会从调用函数的堆栈变量 (obj1( 复制到被调用函数的堆栈变量 (obj2(,没有任何临时对象。那为什么在从函数中按值返回时不能以相同的方式返回。即 obj2 可以直接复制到 obj3,而无需创建任何临时对象(这里忘记 RVO(。

是因为func((可以在不收集其返回值的情况下调用吗? 还是幕后还有其他逻辑?

在C++17之前,事情会像现在这样工作,因为这是语言设定的模型。prvalue 表示临时对象。如果函数要返回 prvalue,则return语句必须使用给定的表达式创建该临时对象。这必然涉及复制/移动操作。将 prvalue 赋值到正在初始化的对象中将执行从临时对象到新对象的复制/移动。

请注意,C++17 通过本质上重新定义 prvalue 来提供有保证的省略。它不再是一个对象;它是对象的初始值设定项。初始化哪个对象取决于 prvalue 的使用方式。return语句不会创建临时语句;它的表达式只是定义初始值设定项是什么。如果使用 prvalue 初始化 prvalue 类型的对象,则会初始化该对象。如果尝试初始化某个其他类型的对象,则会初始化 prvalue 类型的临时对象,并通过该临时对象初始化另一个对象。