灵感来自this answer,来自[expr.const]
常量表达式是一个glvalue核心常量表达式,它指的是一个实体,它是一个常量表达式的允许结果(如下定义),或一个prvalue核心常量表达式,其值满足以下约束:
如果值是类类型的对象,则引用类型的每个非静态数据成员引用一个实体,该实体是常量表达式的允许结果,
如果值是指针类型,则它包含具有静态存储持续时间的对象的地址,超过此类对象末尾的地址([expr.add]),函数的地址,或者空指针值,
如果值是类或数组类型的对象,则每个子对象都满足这些值的约束。
实体是常量表达式的允许结果,如果它是具有静态存储持续时间的对象,该对象不是临时对象或者是其值满足上述约束的临时对象,或者它是一个功能。
具有静态存储持续时间的临时对象究竟是什么?我是否遗漏了某些东西,或者说对象是暂时的并且具有静态存储持续时间是否矛盾?
的定义所有没有动态存储持续时间,没有线程存储持续时间且不是本地的变量都具有静态存储持续时间。这些实体的存储应持续到程序的持续时间
仅适用于变量。
答案 0 :(得分:8)
[basic.stc] / 1告诉我们:
存储持续时间是对象的属性,用于定义包含对象的存储的最小潜在生命周期。
所以每个对象都有一个存储持续时间。此外,第2段说:
静态,线程和自动存储持续时间与声明(6.1)和由实现(15.2)隐式创建的对象相关联。
重点补充。请注意,第15.2节是[class.temporary]:临时对象的规则。
因此,我们可以得出结论,临时对象具有存储持续时间。我们可以得出结论,临时工具必须具有其中一个存储持续时间。实际上,标准中有许多引用变量或临时对象"和他们的存储期限。
然而,尽管这清楚地表明临时对象具有其中一个存储持续时间......标准从未真正说明它们具有的存储持续时间。 [class.temporary]没有声明说绑定到引用的临时文件具有其引用的存储持续时间。 [basic.stc]对静态,自动和线程局部持续时间的解释总是说明变量。
所以我会说这是措辞中的缺陷。很明显,标准期望临时工具具有适当的存储持续时间;有多个地方标准谈论变量或临时对象的存储持续时间。但它从未说明它们实际存在的存储时间。