Я нашел ошибку в 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
?
Ответы
Ответ 1
Да, вы обнаружили ошибку.
Правило выражается в стандарте:
9.4.2-3: Если статический член данных имеет const буквальный тип, его объявление в определение класса может указывать скользящий или равный-инициализатор, в котором каждый параметр-инициализатор, который является присваивание-выражение является константой выражение. Статический член данных буквальный тип может быть объявлен в определение класса с помощью constexpr спецификатор; если да, то его выражение укажет скользящий или равный-инициализатор, в котором каждый параметр-инициализатор, который является присваивание-выражение является константой выражение. [Примечание: В обоих этих случаев, член может появиться в постоянные выражения. - конец примечания] член должен быть определен в область пространства имен, если она используется в программы и области пространства имен определение не должно содержать инициализатор.
Ответ 2
Да, это действительно ошибка. Я наткнулся на твой отчет отчет об ошибке, чтобы поблагодарить за то, что потратил время на его отправку:) Хотя эта ошибка была первоначально зарегистрирована как bug от 4/23/10, ваше представление привлекло мое внимание, и я представил простой patch в группу разработчиков для их просмотра.