Пространство имен с использованием объявления (ошибка в GCC / VS2010)?
-
27-09-2019 - |
Вопрос
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
}
Точно так же ваш код тоже неверно сформирован.