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

时间:2014-06-21 14:18:24

标签: c++ language-lawyer static-members constexpr

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标准似乎有关于此问题的新内容吗?

1 个答案:

答案 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.这样的对象应具有文字类型并且应该被初始化。