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

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

namespace A{
   int i;
}

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

VS2010 - компилирует fine

gcc (ideone) - компилирует fine

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

$7.3.3/8 - "Использование-декларация - это декларация и поэтому могут быть использованы неоднократно, где (и только там) разрешено несколько деклараций.

В приведенном ниже примере показано, что код действительно плохо сформирован.

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

ИЗМЕНИТЬ 2:

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

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