我知道临时对象的生命周期在创建它的完整表达式处或之前结束,除非它绑定到引用,在这种情况下,它的生命周期会扩展到引用的生命周期,这为我们提供了一个下限临时对象的存储期限结束。
2 回答
标准有点模糊。它说临时对象可以具有自动、线程或静态存储持续时间,但在这些存储持续时间的定义中,它只指定变量何时具有这种持续时间。
该标准并没有确切说明每种情况下临时的存储持续时间是多少。相反,它单独描述了临时文件何时被销毁。
除非我弄错了,否则模糊性应该无关紧要。知道对象的存储期限名称对于了解它的生命周期很有用,如果它没有另外指定,但是临时对象的生命周期是另外指定的,所以存储期限名称据我所知没有提供额外的信息。
虽然标准没有这样说,但可以合理地假设,当临时的生命周期通过引用延长时,临时的存储持续时间与引用的存储持续时间相同。否则,生命周期类似于在完整表达式周围的假设块内具有自动存储持续时间的变量。
从您自己的链接:
静态存储时间
(1.1) 没有线程存储持续时间和
(1.2) 属于命名空间范围 ([basic.scope.namespace]) 或首先用 static 或 extern 关键字声明 ([dcl.stc])
临时对象根本没有声明,所以不能用static
orextern
关键字声明它们。它们通常不属于命名空间范围。
线程存储时长
仅当它们被明确声明thread_local
时,这不适用。
自动存储时间
属于块或参数范围且未显式声明为 static、thread_local 或 extern 的变量具有自动存储持续时间。
这将适用于大多数临时对象,因为它们没有明确声明任何东西,并且是由表达式创建的,其中大多数位于块范围内的某个地方。
例外是静态绑定到具有非自动存储持续时间的引用:它必须继承引用的存储持续时间。
记录的示例是临时绑定到具有命名空间范围的引用,并且必须继承静态持续时间。
const S& cr = S(16)+S(23);
请注意,在该示例中,用作参数的临时变量operator+
不会仅仅因为它们的表达式位于命名空间范围内而获得静态持续时间:它们仍然是参数范围,因此是自动的。