12

以下のコードをコンパイルしようとしました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か?

4

2 に答える 2

9

はい、バグを発見しました。

この規則は、標準で次のように表現されています。

9.4.2-3: 静的データ メンバーが const リテラル型の場合、クラス定義でのその宣言は、代入式であるすべての初期化句が定数式であるブレースまたはイコール初期化子を指定できます。リテラル型の静的データ メンバーは、constexpr 指定子を使用してクラス定義で宣言できます。その場合、その宣言は、割り当て式であるすべての初期化子節が定数式であるブレースまたは等号初期化子を指定するものとします。[ 注: どちらの場合も、メンバーは定数式に現れる場合があります。— 末尾の注 ]メンバーがプログラムで使用され、名前空間スコープ定義に初期化子が含まれていない場合、メンバーは名前空間スコープで定義されます。

于 2010-08-20T13:44:07.873 に答える
4

はい、これは確かにバグです。clang へのバグ レポートを偶然見つけました-- 時間を割いて送信していただきありがとうございます :) このバグは当初、2010 年 4 月 23 日にバグとして記録されていましたが、あなたの送信が私の注意を引き、簡単なパッチを送信しました。彼らのレビューのために開発者のグループに。

于 2010-08-22T22:04:28.373 に答える