静态成员是否允许重复初始化?

问题描述 投票:0回答:2

我尝试用

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
中发现了一个错误吗?

c++ g++ static-members clang
2个回答
8
投票

是的,您发现了一个错误。

标准中表述的规则:

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


4
投票

是的,这确实是一个错误。我偶然发现了您向 clang 提交的 bug 报告——感谢您花时间提交它:) 虽然此 bug 最初于 2010 年 4 月 23 日被记录为 bug,但您的提交引起了我的注意,我已经向开发者小组提交了一个简单的patch供他们审核。

© www.soinside.com 2019 - 2024. All rights reserved.