【发布时间】:2018-06-05 07:57:13
【问题描述】:
灵感来自this answer,来自[expr.const]
常量表达式要么是泛指值核心常量表达式,它引用作为常量表达式(如下定义)的允许结果的实体,要么是值满足以下约束的纯右值核心常量表达式:
如果值是类类型的对象,则每个引用类型的非静态数据成员引用一个实体,该实体是常量表达式的允许结果,
如果值是指针类型,则它包含具有静态存储持续时间的对象的地址、此类对象末尾的地址 ([expr.add])、函数的地址或空指针价值,和
如果该值是类或数组类型的对象,则每个子对象都满足该值的这些约束。
如果一个实体是一个具有静态存储持续时间的对象,该对象要么不是临时对象,要么是其值满足上述约束的临时对象,则该实体是常量表达式的允许结果,或者它是一个函数。
究竟什么是具有静态存储持续时间的临时对象?我是否遗漏了某些东西,或者一个对象既是临时的又具有静态存储持续时间是自相矛盾的吗?
来自[basic.stc.static]的定义
所有没有动态存储时长、没有线程存储时长、非本地变量都有静态存储时长。这些实体的存储将持续整个程序的持续时间
仅适用于变量。
【问题讨论】:
-
我会说
static const T& t = T();。 -
@molbdnilo 链接的答案实际上是说临时 not 有静态存储持续时间
-
@PasserBy:那么它有什么存储时长有?
-
@PasserBy 我也有同样的困惑,但在链接的答案中,我们有
const T& r... 这不是静态存储持续时间参考。
标签: c++ language-lawyer