Я попытался скомпилировать приведенный ниже код с помощью 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 спецификатор; если да, то его декларация должен указать фигурная скобка или равный инициализатор, в котором каждое предложение инициализатора, которое является выражение-присваивание является константой выражение. [Примечание: в обоих случаях член может появиться в постоянные выражения. - конечное примечание] член по-прежнему определяется в область пространства имен, если она используется в программа и область пространства имен определение не должно содержать инициализатор.
Да, это действительно ошибка. Я наткнулся на ваш отчет об ошибке в clang - спасибо, что нашли время отправить его :) Хотя эта ошибка была первоначально зарегистрирована как ошибка 4/23/10, ваше сообщение привлекло мое внимание, и я отправил простой патч на рассмотрение группе разработчиков.