临时对象

临时对象是由编译器创建的未命名对象,用于存储临时值。

备注

在某些情况下,编译器需要创建临时对象。 可能会出于下列原因创建这些临时对象:

  • 使用一个类型不同于所初始化引用的基础类型的初始化表达式来初始化 const 引用。

  • 存储返回用户定义类型 (UDT) 的函数的返回值。 仅当程序未将返回值复制到对象时,才会创建这些临时对象。 例如:

    UDT Func1();    //  Declare a function that returns a user-defined
                    //   type.
    
    ...
    
    Func1();        //  Call Func1, but discard return value.
                    //  A temporary object is created to store the return
                    //   value.
    

    由于未将返回值复制到另一个对象,因此创建了临时对象。 创建临时内存更常见的情况是在计算必须调用重载运算符函数的表达式时。 这些重载的运算符函数将返回用户定义类型,该类型通常不会复制到另一个对象。

    请考虑表达式 ComplexResult = Complex1 + Complex2 + Complex3。 将计算表达式 Complex1 + Complex2,并且结果将存储在临时对象中。 接下来,计算表达式 temporary + Complex3,并将结果复制到 ComplexResult(假设未重载赋值运算符)

  • 存储强制转换为用户定义的类型的结果。 在给定类型的对象显式转换为用户定义的类型时,将构造一个新对象作为临时对象。

临时对象具有根据其创建点和销毁点定义的生存期。 任何创建多个临时对象的表达式最终都会按与这些对象的创建顺序相反的顺序来销毁它们。

临时销毁发生的时间取决于它的使用方式:

  • 用于初始化 const 引用的临时对象:
    如果初始化表达式不是与正在初始化的引用类型相同的左值,则会创建基础对象类型的临时值。 初始化表达式会对其进行初始化。 此临时对象将在其绑定到的引用对象销毁后立即销毁。 由于此销毁很可能在创建临时表达式之后发生,因此有时称为生存期扩展

  • 作为表达式计算结果创建的临时对象:
    所有不属于第一类的临时对象,以及作为表达式计算结果而创建的所有临时对象,都在表达式语句的末尾(即分号处)或用于 forifwhiledoswitch 语句的控制表达式的末尾销毁。

另请参阅

Herb Sutter 关于简单参考的博客