Пространство имен с помощью объявления (ошибка в 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 ответа:
Пример, на который вы ссылаетесь, известен как несогласованный . Комитет еще не решил эту проблему.
Итак, это ошибка в 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 }
Точно так же и ваш код плохо сформирован.