什么是具有静态存储持续时间

时间:2017-12-22 17:34:25

标签: c++ language-lawyer

灵感来自this answer,来自[expr.const]

  

常量表达式是一个glvalue核心常量表达式,它指的是一个实体,它是一个常量表达式的允许结果(如下定义),或一个prvalue核心常量表达式,其值满足以下约束:

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

  •   
  • 如果值是指针类型,则它包含具有静态存储持续时间的对象的地址,超过此类对象末尾的地址([expr.add]),函数的地址,或者空指针值,

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

  •   
     

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

具有静态存储持续时间的临时对象究竟是什么?我是否遗漏了某些东西,或者说对象是暂时的并且具有静态存储持续时间是否矛盾?

[basic.stc.static]

的定义
  

所有没有动态存储持续时间,没有线程存储持续时间且不是本地的变量都具有静态存储持续时间。这些实体的存储应持续到程序的持续时间

仅适用于变量

1 个答案:

答案 0 :(得分:8)

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

  

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

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

  

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

重点补充。请注意,第15.2节是[class.temporary]:临时对象的规则。

因此,我们可以得出结论,临时对象具有存储持续时间。我们可以得出结论,临时工具必须具有其中一个存储持续时间。实际上,标准中有许多引用变量或临时对象"和他们的存储期限。

然而,尽管这清楚地表明临时对象具有其中一个存储持续时间......标准从未真正说明它们具有的存储持续时间。 [class.temporary]没有声明说绑定到引用的临时文件具有其引用的存储持续时间。 [basic.stc]对静态,自动和线程局部持续时间的解释总是说明变量。

所以我会说这是措辞中的缺陷。很明显,标准期望临时工具具有适当的存储持续时间;有多个地方标准谈论变量或临时对象的存储持续时间。但它从未说明它们实际存在的存储时间。