【发布时间】:2017-06-30 06:35:09
【问题描述】:
考虑到example from this page,转载如下
struct S {
static const int c;
};
const int d = 10 * S::c; // not a constant expression: S::c has no preceding
// initializer, this initialization happens after const
const int S::c = 5; // constant initialization, guaranteed to happen first
为什么d 的初始化不是常量表达式(因此不是常量初始化过程的一部分)?评论似乎说这是因为它使用了一个没有前面的初始化程序的值,但是在将表达式限定为常量表达式的条件列表中似乎没有提到(条件列在@987654322 @)。特别是它违反了哪个条件使某事物成为常量表达式?
如果它与必须在编译时评估常量初始化的事实有关,那么标准提到常量初始化不需要在编译时发生,甚至可以在例如加载时发生。那么为什么不在编译时初始化 c 而在加载时初始化 d 呢? (我可能会认为自己在这里陷入了一个圈子)
Thanks to Jayesh我能找到一个类似的问题"surprising" constant initialization because of definition order,但答案似乎是关于左值到右值的转换,这里的左值到右值的转换在哪里?除此之外,这里没有引用标准中的哪些条件被违反。答案也没有解释为什么初始化没有在加载时和编译时分开。
【问题讨论】:
-
const表示只读而不是常量。
标签: c++ c++14 language-lawyer c++17