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


namespace A{
   int i;
}

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

VS2010-compiles fine

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

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

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

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

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

Правка 2:

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

2 12

2 ответа:

Пример, на который вы ссылаетесь, известен как несогласованный . Комитет еще не решил эту проблему.

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

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

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

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

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

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

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

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

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