为什么在按值返回时创建临时对象,而不是在按值传递给函数参数时创建临时对象
why temporary object gets created while returning by value not while passing by value to function parameter
原型:
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 类型的临时对象,并通过该临时对象初始化另一个对象。
相关文章:
- 为什么当我们有常量引用时创建临时对象?
- 为什么在按值返回时创建临时对象,而不是在按值传递给函数参数时创建临时对象
- 我试图创建临时对象的方式有错误吗
- 将项添加到矢量而不创建临时对象
- 在此初始化中创建的临时对象数
- 在没有返回值优化的情况下将两个对象加在一起时,将创建多少个临时对象
- C++:如何创建一个临时对象,包含一个指针 - 常量或非常量,具体取决于上下文
- 按值函数创建范围的临时对象
- 从函数返回引用是否会导致在使用'auto'时创建新的临时对象?
- C++17:是编译器为(静态存储持续时间)const引用绑定创建的可修改的临时对象(和存储)
- 是否在对象中创建临时接口
- Visual Studio 在类型转换时不会创建临时对象
- 通过引用捕获异常时未创建临时对象
- 返回临时对象是否会在C++中创建临时对象
- 在引用初始化期间如何创建临时对象
- 创建c++临时对象
- 我可以直接调用operator()而不创建临时对象吗?
- 在复制构造函数中创建临时对象
- c++优先级队列推送/模板,而不创建临时对象
- 构造函数 c++ Object obj = Object( "string" , 22);正在创建临时对象?