Использование повторного объявления в области блока

Вот код, который вызывает ошибку времени компиляции:

#include <iostream>

int a;

void f()
{
    using ::a;
    using ::a; //'a' is already declared in this scope. 
}

int main(){ }

ДЕМО

Стандарт говорит (N4296::7.3.3/10 [namespace.udecl]):

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

Итак, я предположил, что любое повторное объявление неправильно сформировано в области блока. Но программа

#include <iostream>

void f()
{
    extern int a;
    extern int a;
}

int main(){ }

ДЕМО

работает отлично. Так почему же повторная декларация использования на самом деле предотвращается от двойного появления в области блока?


person Community    schedule 16.01.2015    source источник
comment
Таким образом, ... можно использовать повторно, это не обязательно означает, что вы можете использовать одно и то же имя повторно. Это просто означает, что вы можете написать несколько операторов using ...; в начале блока.   -  person Rufflewind    schedule 16.01.2015
comment
@Rufflewind Да, но это не отвечает на мой вопрос, потому что до сих пор неясно, почему мы не можем повторно объявить имя с помощью объявления using в той же области.   -  person    schedule 16.01.2015
comment
Официальный стандарт фактически дает явный пример, который запрещает то, что вы делаете прямо сейчас, но не все компиляторы обнаружить его, и он немного несовместим с остальной частью языка, как указано в это сообщение о дефекте стандарта C++.   -  person Rufflewind    schedule 16.01.2015
comment
Extern можно объявлять сколько угодно раз   -  person Ankur    schedule 16.01.2015
comment
Есть ли причина не закрыть это как дубликат stackoverflow.com/q/4252451, предложенный @Rufflewind?   -  person Jonathan Leffler    schedule 16.01.2015
comment
@JonathanLeffler Да, теперь совершенно ясно.   -  person    schedule 16.01.2015