Подтвердить что ты не робот

Я нашел ошибку в Clang?

Я попытался скомпилировать код ниже с помощью Clang

class Prasoon{

  static const int dummy = 0;

};
int const Prasoon::dummy = 0;

int main(){}

Приведенный выше код не выдавал ошибок при компиляции с помощью Clang.

[email protected] ~ $ clang++ --version
clang version 2.8 (trunk 107611)
Target: i386-pc-linux-gnu
Thread model: posix
[email protected] ~ $ cat bug.cpp
class Prasoon{

      private:
      static const int dummy = 0;

    };

int const Prasoon::dummy = 0;

int main(){}
[email protected] ~ $ clang++ bug.cpp
[email protected] ~ $ 

Но когда я скомпилировал тот же код с g++, я получил ошибку, как ожидалось.

[email protected] ~ $ g++ bug.cpp
bug.cpp:8: error: duplicate initialization of ‘Prasoon::dummy’

Итак, я нашел ошибку в Clang?

4b9b3361

Ответ 1

Да, вы обнаружили ошибку.

Правило выражается в стандарте:

9.4.2-3: Если статический член данных имеет const буквальный тип, его объявление в определение класса может указывать скользящий или равный-инициализатор, в котором каждый параметр-инициализатор, который является присваивание-выражение является константой выражение. Статический член данных буквальный тип может быть объявлен в определение класса с помощью constexpr спецификатор; если да, то его выражение укажет скользящий или равный-инициализатор, в котором каждый параметр-инициализатор, который является присваивание-выражение является константой выражение. [Примечание: В обоих этих случаев, член может появиться в постоянные выражения. - конец примечания] член должен быть определен в область пространства имен, если она используется в программы и области пространства имен определение не должно содержать инициализатор.

Ответ 2

Да, это действительно ошибка. Я наткнулся на твой отчет отчет об ошибке, чтобы поблагодарить за то, что потратил время на его отправку:) Хотя эта ошибка была первоначально зарегистрирована как bug от 4/23/10, ваше представление привлекло мое внимание, и я представил простой patch в группу разработчиков для их просмотра.