Почему отклонено повторное объявление статического члена

Я думал, что мы можем повторно объявить имя в любое время в любом контексте. Но

class A 
{
    static int a;
    static int a;
};

возвращает ошибку времени компиляции:

test.cpp:4:13: error: redeclaration of ‘int A::a’
test.cpp:3:13: note: previous declaration ‘int A::a’

Какие имена можно на самом деле переобъявить?


person St.Antario    schedule 13.05.2014    source источник
comment
Разве вы не ответили на этот вопрос несколько минут назад в предыдущем вопросе?   -  person deviantfan    schedule 13.05.2014
comment
в чем разница между первым и вторым a?   -  person Raxvan    schedule 13.05.2014
comment
@Raxvan Меня интересует, где в стандарте отказано в этом повторном объявлении. Ты можешь мне ответить?   -  person St.Antario    schedule 13.05.2014
comment
@deviantfan Это два вопроса от ответчика.   -  person St.Antario    schedule 13.05.2014
comment
@ Сент-Антарио: Не совсем, только наоборот, и ответ должен быть тот же. См. Комментарий Майка Сеймура: stackoverflow.com/ questions / 23624844 /   -  person deviantfan    schedule 13.05.2014


Ответы (3)


C ++ 11 9.2 / 1 [class.mem]

Член не должен объявляться дважды в спецификации-члене, за исключением того, что можно объявить вложенный класс или шаблон класса-члена, а затем определить его позже, и за исключением того, что перечисление может быть введено с помощью opaque-enum-декларация, а затем повторно объявлена ​​с помощью спецификатора-перечисления.

person Mike Seymour    schedule 13.05.2014
comment
Спасибо. Это то, что я ищу. - person St.Antario; 13.05.2014

Согласно стандарту C ++ (члены класса 9.2, пункт 1)

Член не должен объявляться дважды в спецификации члена, за исключением того, что можно объявить вложенный класс или шаблон класса члена, а затем определить его позже, и за исключением того, что перечисление может быть введено с помощью объявления opaque-enum и позже повторно объявлено с помощью спецификатор перечисления.

person Vlad from Moscow    schedule 13.05.2014

Помимо других ответов, ваш код - это не только повторное объявление, но и новое определение, что явно нарушает правило одного определения.

person bjhend    schedule 13.05.2014
comment
Нет никакого переопределения. На самом деле declaration is a definition unless it declares a function without specifying the function’s body (8.4), it contains the extern specifier (7.1.1) or a linkage-specification 25 (7.5) and neither an initializer nor a function-body, it declares a static data member in a class definition (9.2, 9.4) - person St.Antario; 13.05.2014
comment
Подробнее см. Раздел 3.1.2. - person St.Antario; 13.05.2014
comment
Ты прав. Я прочитал слишком быстро и упустил из виду, что вы определяете класс, а не функцию. - person bjhend; 13.05.2014