Пространство имен с использованием объявления (ошибка в GCC/VS2010)?

namespace A{
   int i;
}

int main(){
   using A::i;
   using A::i;
}

VS2010 - отлично компилируется

gcc (ideone) — компилируется нормально

Comeau - выдает ошибку ""ComeauTest.c", строка 10: ошибка: "i" уже объявлен в текущей области видимости с помощью A::i;"

$7.3.3/8 — «Объявление использования — это объявление, поэтому его можно использовать повторно там, где (и только там) разрешено несколько объявлений».

Пример прямо здесь указывает на то, что код действительно неправильно сформирован.

Итак, это ошибка в GCC и VS2010?

РЕДАКТИРОВАТЬ 2:

Удалите несколько using directives, поскольку они не связаны с имеющимся запросом.


person Chubsdad    schedule 23.11.2010    source источник
comment
Насколько я понимаю, это должна быть ошибка в Comeau, а не в MSVC/GCC, по той же причине это нормально: int main(){ extern int i; extern int i;}. Очевидно, я упускаю что-то простое.   -  person GManNickG    schedule 23.11.2010
comment
@GMan : Проверьте 7.3.3/8 один раз.   -  person Prasoon Saurav    schedule 23.11.2010
comment
@Prasoon: более прямолинейно, спасибо.   -  person GManNickG    schedule 23.11.2010
comment
Кстати, я хочу убить систему комментирования SO. Сначала он жалуется на менее чем 15 символов. Затем он жалуется на менее чем 15 секунд с момента последней попытки. И так далее. Проклятую систему надо выпороть, содрать кожу и расстрелять крупной солью, затем пытать, высмеивать, плевать и т. д. и утопить в подводном вулкане.   -  person Cheers and hth. - Alf    schedule 23.11.2010
comment
@Alf: я согласен [OneMoreCharNeededButI'llPutThisLongFillerTextInInsteadBecauseIAmIrritated]   -  person James McNellis    schedule 23.11.2010
comment
@Alf: Конечно, вы можете поблагодарить Этвуда за эту ерунду. Например: здесь или здесь. Так глупо...   -  person GManNickG    schedule 23.11.2010
comment
@GMan Я все еще думаю, что в MSGC/GCC/Clang это не неправильно. Я не думаю, что можно утверждать, что у Комо это неправильно, потому что, очевидно, намерение состоит в том, чтобы оно было неправильным, но говорить, что у других это неправильно, кажется мне слишком тяжелым (потому что на каком нормативном тексте основано намерение). на?). Смотрите мой комментарий к ответу @Jame.   -  person Johannes Schaub - litb    schedule 24.11.2010
comment
@Johannes: Рад, что я не одинок в мысли, что все должно быть в порядке. :)   -  person GManNickG    schedule 24.11.2010
comment
Это выпуск CWG 36.   -  person M.M    schedule 16.01.2015


Ответы (2)


Известно, что пример, на который вы ссылаетесь, несовместим. Комитет еще не исправил это.

Итак, это ошибка в GCC и VS2010?

Я не думаю, что это ошибка ни в GCC/VS2010/Clang, ни в Comeau. Похоже, это ошибка в стандарте С++. В этих случаях составители компиляции должны решить, что является наиболее жизнеспособным. Если вы удалите рассматриваемый пример, то 3.3/4 утверждает, что пример действителен: «Учитывая набор объявлений в одной декларативной области, каждое из которых указывает одно и то же неполное имя, ... все они должны ссылаться на один и тот же объект , или все относятся к функциям и шаблонам функций, или ...".

Возникает вопрос, как обсуждалось в связанной проблеме, что имеется в виду в 7.3.3/8, когда в нем говорится о «декларациях», по которым комитет не пришел к консенсусу. Итак, до тех пор для GCC/VS2010 и Clang применяется 3.3/4, а Комо предпочитает использовать другую семантику.

person Johannes Schaub - litb    schedule 23.11.2010

Да ты прав. Это действительно ошибка в g++, MSVC++ и Clang. Комо правильно понял.

Как вы сказали, 7.3.3/8 говорит

Объявление-использования является объявлением и, следовательно, может многократно использоваться там, где (и только там) разрешено несколько объявлений.

Также приведен следующий фрагмент кода.

void f()
{
    using A::i;
    using A::i;  //error: double declaration
}

Точно так же ваш код тоже плохо сформирован.

person Prasoon Saurav    schedule 23.11.2010