临时对象的存储持续时间是多少:自动、线程、静态还是动态?

What is the storage duration of a temporary object: automatic, thread, static, or dynamic?

什么是storage duration of a temporary object:自动、线程、静态还是动态?

我知道临时对象的 lifetime 在创建它的完整表达式处或之前结束,除非它绑定到一个引用,在这种情况下,它的生命周期会延长到引用的生命周期这为我们提供了临时对象存储持续时间结束的下限。

标准有点模糊。它说临时对象可以有自动、线程或静态存储持续时间,但在这些存储持续时间的定义中,它只指定何时变量有这样的持续时间。

该标准并未准确说明每种情况下临时文件的存储期限是多少。相反,它单独描述临时文件何时被销毁。

除非我弄错了,否则含糊不清应该无关紧要。知道对象的存储持续时间名称对于在未另行指定时了解其生命周期很有用,但临时对象的生命周期是另外指定的,因此据我所知,存储持续时间名称不提供其他信息。

虽然标准没有这么说,但可以合理地假设当临时文件的生命周期被引用延长时,临时文件的存储持续时间与引用相同。否则,生命周期类似于在围绕完整表达式的假设块中具有自动存储持续时间的变量。

来自你自己的 link:

Static storage duration

  • (1.1) do not have thread storage duration and

  • (1.2) belong to a namespace scope ([basic.scope.namespace]) or are first declared with the static or extern keywords ([dcl.stc])

临时变量根本没有被声明,所以它们不能用 staticextern 关键字声明。它们通常不属于命名空间范围。

Thread storage duration

只有明确声明 thread_local,所以 不适用。

Automatic storage duration

Variables that belong to a block or parameter scope and are not explicitly declared static, thread_­local, or extern have automatic storage duration.

这将适用于大多数临时对象,因为它们没有明确声明 任何东西,并且是由表达式创建的,其中大部分位于块作用域内的某个位置。

例外是静态绑定到具有非自动存储持续时间的引用:它必须继承引用的存储持续时间。

记录的 example 是临时绑定到具有命名空间范围的引用,并且必须继承静态持续时间。

const S& cr = S(16)+S(23);

请注意,在该示例中,用作 operator+ 参数的临时对象不会获得静态持续时间,只是因为它们的表达式在命名空间范围内:它们仍然是 参数范围,因此是自动的。