2015-04-28 12 views

risposta

18

[basic.link]/p7, sottolineatura mia:

Quando una dichiarazione blocco portata di un'entità con sollevatore non viene trovato riferirsi a qualche altra dichiarazione, allora quell'entità è un membro della lo spazio dei nomi più interno che racchiude. Tuttavia, tale dichiarazione non introduce nel suo spazio dei nomi.

[namespace.memdef]/p2, sottolineatura mia:

I membri di un namespace possono essere definiti anche al di fuori che namespace per qualifica esplicita (3.4.3.2) del nome essendo definito, a condizione che l'entità definita sia già stata dichiarata nello spazio dei nomi e che la definizione venga visualizzata dopo il punto della dichiarazione in uno spazio dei nomi che racchiuda lo spazio dei nomi della dichiarazione.

GCC è corretto. Il tuo primo frammento è mal formato.

+0

Hai ragione. Ho mancato di notare [namespace.memdef]/2. (+1) – Leon

+0

A proposito, c'è qualcosa che parla effettivamente contro le funzioni definite localmente? Apparentemente, le classi locali possono definire le loro funzioni membro localmente. – Columbo

+0

@Columbo [dcl.fct.def.general]/p2 –

4

sembra abbastanza chiaro a me da [basic.link]/7

... Tuttavia una tale dichiarazione non introduce il nome del membro nella suo campo di applicazione dello spazio dei nomi.

che clang è sbagliato. Allo stesso modo non ti aspetti che questo compili:

namespace A 
{ 
} 

void A::foo() 
{ 
}