6 c++ static-members language-lawyer constexpr
Clang和GCC不同意以下代码是否有效C++11:
struct Thing {
int value;
static const Thing thing;
};
constexpr Thing Thing::thing {3};
Run Code Online (Sandbox Code Playgroud)
Clang编译并GNU GCC version 4.7.2说:
error: redeclaration ‘Thing::thing’ differs in ‘constexpr’
constexpr Thing Thing::thing {3};
哪个编译器对标准的解释是正确的?看起来C++14标准是否会有关于此事的新内容?
该片段是合法的C++ 11,并且C++ 14没有变化.
注意:
gcc 4.9.0正确接受代码段,即.拒绝该片段是以前版本的编译器中的一个错误.
所述constexpr符肯定影响所定义的对象(它将被宣布常量),但特别是在对象中声明的说明符任务;
struct Thing {
int value;
static const Thing thing; // (A)
};
constexpr Thing Thing::thing {3}; // (B)
Run Code Online (Sandbox Code Playgroud)
这意味着定义(B)指的是Thing const名为thing的类型的对象,它与(A)相同,因此; 该片段是合法的.
7.1.5p9的constexpr说明符[dcl.constexpr](n3337)
constexpr对象声明中使用的说明符将对象声明为const.此类对象应具有文字类型并应初始化.