我尝试用
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
中发现了一个错误吗?
是的,您发现了一个错误。
标准中表述的规则:
9.4.2-3: 如果静态数据成员是 const 文字类型,其声明在 类定义可以指定一个 大括号或等号初始化器,其中 每个初始化子句都是 赋值表达式是一个常量 表达。静态数据成员 文字类型可以在 使用 constexpr 定义类 说明符;如果是这样,其声明 应指定一个 大括号或等于初始化器,其中 每个初始化子句都是 赋值表达式是一个常量 表达。 [注:在这两个 在这种情况下,该成员可能会出现在 常量表达式。 — 尾注] The 成员仍应定义在 命名空间范围,如果它被用在 程序和命名空间范围 定义不应包含 初始化器。