Clang和GCC不同意以下代码是否有效C++11
:
struct Thing {
int value;
static const Thing thing;
};
constexpr Thing Thing::thing {3};
Clang编译它并GNU GCC version 4.7.2
说:
error: redeclaration ‘Thing::thing’ differs in ‘constexpr’
constexpr Thing Thing::thing {3};
哪个编译器对标准的解释是正确的?似乎C++14
标准似乎有关于此问题的新内容吗?
答案 0 :(得分:6)
该代码段是合法的 C ++ 11 , C ++ 14 没有变化。
注意:
gcc 4.9.0
正确接受代码段,即。拒绝该片段是以前版本的编译器中的一个错误。
constexpr 说明符肯定会影响正在定义的对象(它将被声明为 const ),但特别是说明符要求对象声明;
struct Thing {
int value;
static const Thing thing; // (A)
};
constexpr Thing Thing::thing {3}; // (B)
这意味着定义(B)指的是名为 thing 的Thing const
类型的对象,它与(A)相同,因此;该片段是合法的。
7.1.5p9
constexpr
说明符[dcl.constexpr]
(n3337)对象声明中使用的
constexpr
说明符将对象声明为const.
这样的对象应具有文字类型并且应该被初始化。