我尝试使用Clang
class Prasoon{
static const int dummy = 0;
};
int const Prasoon::dummy = 0;
int main(){}
使用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 ~ $
但是当我用g++
编译相同的代码时,我得到了一个错误。
prasoon@prasoon-desktop ~ $ g++ bug.cpp
bug.cpp:8: error: duplicate initialization of ‘Prasoon::dummy’
我在Clang
找到了一个错误吗?
答案 0 :(得分:9)
是的,你发现了一个错误。
规则以标准表示:
9.4.2-3: 如果静态数据成员是const 字面类型,它的声明在 类定义可以指定一个 支撑或均衡初始化器 每个初始化子句都是一个 assignment-expression是一个常量 表达。静态数据成员 文字类型可以在中声明 使用constexpr进行类定义 符;如果是这样,它的声明 应指明一个 支撑或等于初始化器 每个初始化子句都是一个 assignment-expression是一个常量 表达。 [注意:在这两个方面 案件,会员可能会出现在 常数表达式。 - 尾注] 会员仍应在a。中定义 命名空间作用域,如果它在 程序和命名空间范围 定义不得包含 初始化程序。强>
答案 1 :(得分:4)
是的,这确实是一个错误。我偶然发现了你的bug report铿锵声 - 感谢花时间提交它:)虽然这个bug最初在4月23日以bug的形式记录下来,但是你的提交引起了我的注意我已经向开发人员小组提交了一份简单的patch供他们审核。