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

StackOverflow https://stackoverflow.com/questions/4252451

Вопрос

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 - "Using-declaration является декларацией и, следовательно, может использоваться повторно там (и только там), где разрешено несколько деклараций".

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

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

ПРАВКА 2:

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

Это было полезно?

Решение

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

Итак, это ошибка в 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
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top