【发布时间】:2016-03-04 09:55:11
【问题描述】:
考虑以下代码:
#include <iostream>
struct Foo {
static int const i = i + 1;
};
int main() {
std::cout << Foo::i << std::endl;
}
Clang 3.7 版对此进行编译并输出 1。
虽然 GCC 版本 5.3 发出错误:
错误:“i”未在此范围内声明
问:
两种编译器中哪一种符合 C++ 标准?
【问题讨论】:
-
static int const i = i + 1;意义不大,如果要初始化为1,就初始化为1即可。 -
@Shark 确实如此。然而,这是一个语言律师问题。
-
通常是对象is fully defined when you reach the
=。不知道 const 静态成员有没有什么特殊规定。但是当然是UB读取初始化器中的value了。 -
@BoPersson 如果可能,读取不会未定义。由于不执行常量初始化(初始化器不是常量表达式),因此进行零初始化,这发生在动态初始化之前。
标签: c++ gcc clang language-lawyer static-members