返回临时对象是否在C中创建一个临时对象?

考虑C中的以下代码
struct A {A(int);};
A foo() {return static_cast<A>(0);}
A x = foo();

这里static_cast< A>(0)通过标准[5.2.9-4]创建一个临时对象,这是一个prvalue.标准[12.2-1]说

Temporaries of class type are created in varIoUs contexts: binding a reference to a prvalue (8.5.3),returning a prvalue (6.6.3),a conversion that creates a prvalue (4.1,5.2.9,5.2.11,5.4),throwing an exception (15.1),entering a handler (15.3),and in some initializations (8.5).

那么return语句也会再次创建一个临时对象?

顺便说一句,任何人都可以告诉我,标准是否保证隐式类型转换会创建一个临时对象?

解决方法

(§4/ 6)提到

The effect of any implicit conversion is the same as performing the corresponding declaration and initialization and then using the temporary variable as the result of the conversion.

所以是的,除非优化,应该创建一个临时应用程序,但我确信所有现代编译器将在您的案例中执行一个复制检查.这个特殊的优化叫做return value optimization (RVO).你可以通过具有副作用的构造函数来进行测试:

struct A {
    A(int){
        std::cout << "ctor";
    }
    A(const A & other)
    {
        std::cout << "copy ctor";
    }
    A(A&&other)
    {
        std::cout << "move ctor";
    }
};

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...