灵感来自这个答案,来自[expr. const]
常量表达式要么是一个glvalue core常量表达式,它引用一个实体,该实体是常量表达式(定义如下)的允许结果,要么是一个prvalue core常量表达式,其值满足以下约束:
>
如果值是类类型的对象,则引用类型的每个非静态数据成员都引用一个实体,该实体是常量表达式的允许结果,
如果该值是指针类型,则它包含具有静态存储持续时间的对象的地址、此类对象末尾之后的地址([excr. add])、函数的地址或空指针值,以及
如果该值是类或数组类型的对象,则每个子对象都满足该值的这些约束。
如果实体是具有静态存储持续时间的对象,并且不是临时对象或其值满足上述约束的临时对象,或者它是一个函数,则实体是常量表达式的允许结果。
究竟什么是具有静态存储持续时间的临时对象?我是缺少了什么,还是一个对象既是临时的又具有静态存储持续时间是自相矛盾的?
来自[basic.stc静态]的定义
所有没有动态存储时长、没有线程存储时长、不本地的变量都有静态存储时长。这些实体的存储应持续到程序运行期间
仅适用于变量。
[basic.stc]/1告诉我们:
存储持续时间是对象的属性,它定义了包含该对象的存储的最小潜在生命周期。
所以每个对象都有一个存储持续时间。此外,第2段说:
静态、线程和自动存储持续时间与声明(6.1)引入并由实现(15.2)隐式创建的对象相关联。
添加了重点。请注意,第15.2节是[class.临时]:临时对象的规则。
因此,我们可以得出结论,临时对象具有存储持续时间。我们可以得出结论,临时对象必须具有其中一个存储持续时间。事实上,标准中有许多对“变量或临时对象”及其存储持续时间的引用。
然而,尽管这清楚地说明了临时对象具有这些存储持续时间之一…标准实际上从未说明它们具有什么存储持续时间。[class.临时]没有声明绑定到引用的临时对象具有其引用的存储持续时间。[basic.stc]对静态、自动和线程本地持续时间的解释总是提到变量。
所以我会说这是措辞上的缺陷。似乎很明显,标准期望临时对象具有适当的存储持续时间;标准在多个地方谈到了可变或临时对象的存储持续时间。但它从未说过它们实际具有什么存储持续时间。