提问者:小点点

什么是静态存储时长的临时对象


灵感来自这个答案,来自[expr. const]

常量表达式要么是一个glvalue core常量表达式,它引用一个实体,该实体是常量表达式(定义如下)的允许结果,要么是一个prvalue core常量表达式,其值满足以下约束:

>

  • 如果值是类类型的对象,则引用类型的每个非静态数据成员都引用一个实体,该实体是常量表达式的允许结果,

    如果该值是指针类型,则它包含具有静态存储持续时间的对象的地址、此类对象末尾之后的地址([excr. add])、函数的地址或空指针值,以及

    如果该值是类或数组类型的对象,则每个子对象都满足该值的这些约束。

    如果实体是具有静态存储持续时间的对象,并且不是临时对象或其值满足上述约束的临时对象,或者它是一个函数,则实体是常量表达式的允许结果。

    究竟什么是具有静态存储持续时间的临时对象?我是缺少了什么,还是一个对象既是临时的又具有静态存储持续时间是自相矛盾的?

    来自[basic.stc静态]的定义

    所有没有动态存储时长、没有线程存储时长、不本地的变量都有静态存储时长。这些实体的存储应持续到程序运行期间

    仅适用于变量。


  • 共1个答案

    匿名用户

    [basic.stc]/1告诉我们:

    存储持续时间是对象的属性,它定义了包含该对象的存储的最小潜在生命周期。

    所以每个对象都有一个存储持续时间。此外,第2段说:

    静态、线程和自动存储持续时间与声明(6.1)引入并由实现(15.2)隐式创建的对象相关联。

    添加了重点。请注意,第15.2节是[class.临时]:临时对象的规则。

    因此,我们可以得出结论,临时对象具有存储持续时间。我们可以得出结论,临时对象必须具有其中一个存储持续时间。事实上,标准中有许多对“变量或临时对象”及其存储持续时间的引用。

    然而,尽管这清楚地说明了临时对象具有这些存储持续时间之一…标准实际上从未说明它们具有什么存储持续时间。[class.临时]没有声明绑定到引用的临时对象具有其引用的存储持续时间。[basic.stc]对静态、自动和线程本地持续时间的解释总是提到变量。

    所以我会说这是措辞上的缺陷。似乎很明显,标准期望临时对象具有适当的存储持续时间;标准在多个地方谈到了可变或临时对象的存储持续时间。但它从未说过它们实际具有什么存储持续时间。