我在Clang中发现了一个错误吗?

Pra*_*rav 12 c++ g++ clang static-members

我试着用下面的代码编译 Clang

class Prasoon{

  static const int dummy = 0;

};
int const Prasoon::dummy = 0;

int main(){}
Run Code Online (Sandbox Code Playgroud)

编译时上面的代码没有给出任何错误 Clang.

prasoon@prasoon-desktop ~ $ clang++ --version
clang version 2.8 (trunk 107611)
Target: i386-pc-linux-gnu
Thread model: posix
prasoon@prasoon-desktop ~ $ cat bug.cpp
class Prasoon{

      private:
      static const int dummy = 0;

    };

int const Prasoon::dummy = 0;

int main(){}
prasoon@prasoon-desktop ~ $ clang++ bug.cpp
prasoon@prasoon-desktop ~ $ 
Run Code Online (Sandbox Code Playgroud)

但是当我编译相同的代码时,g++我得到了预期的错误.

prasoon@prasoon-desktop ~ $ g++ bug.cpp
bug.cpp:8: error: duplicate initialization of ‘Prasoon::dummy’
Run Code Online (Sandbox Code Playgroud)

我找到了一个bug Clang吗?

M. *_* E. 9

是的,你发现了一个bug.

该规则在标准中表达:

9.4.2-3:如果静态数据成员是const文字类型,则它在类定义中的声明可以指定一个大括号或等于初始化器,其中作为赋值表达式的每个initializer子句都是一个常量表达式.可以使用constexpr说明符在类定义中声明文字类型的静态数据成员; 如果是这样,它的声明应指定一个大括号或等于初始化器,其中作为赋值表达式的每个initializer子句都是一个常量表达式.[注意:在这两种情况下,成员可能会出现在常量表达式中.- 结束注释] 如果在程序中使用该成员,并且命名空间作用域定义不包含初始化程序,则该成员仍应在命名空间作用域中定义.