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