嵌套的静态constexpr类型不完整.有效的C++与否?

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标准是否会有关于此事的新内容?

Fil*_*efp 6

介绍

该片段是合法的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.此类对象应具有文字类型并应初始化.