2012-11-29 14 views
7

C++ 03 standard 7.3.1.1 [namespace.unnamed] paragrafo 1: (e C++ 11 standard utilizzano anche la definizione simile)C++ senza nome (anonimo) namespace definizione

Un senza nome-namespace- definizione si comporta come se fosse sostituito da

namespace unique { /* empty body */ } 
using namespace unique; 
namespace unique { namespace-body } 

Perché non sta semplicemente seguendo definizione?

namespace unique { namespace-body } 
using namespace unique; 

domanda laterale: MSDN definisce per quest'ultima forma. Viola lo standard tecnicamente?

+1

Penso che questo sia dovuto al fatto che nel 'namespace-body' si accede alle entità senza qualificazione aggiuntiva, il che richiede che' l'utilizzo di namespace unique' sia già in vigore. –

+3

@mat nel corpo di uno spazio dei nomi puoi sempre fare riferimento a cose definite in quel namespace senza qualificazione –

+0

@ JohannesSchaub-litb: lo so, mi stavo chiedendo l'effetto degli scontri con l'ambiente circostante anche se –

risposta

7

Non si poteva farlo più

namespace { typedef int a; ::a x; } 

Si noti che in una successiva namespace { ... }, improvvisamente si poteva. Questo sarebbe orribilmente incoerente.

notare anche in questo caso, con due diversi esiti validi

namespace A { void f(long); } 
using namespace A; 

namespace { 
    void f(int); 
    void g() { 
    ::f(0); 
    } 
} 

Con ISO C++, ciò richiede la versione int di f. Con la tua definizione alternativa, chiama la versione long.

+2

Mi ci è voluto un po 'per capisci dalla tua risposta che ciò che intendi è ciò che esprimerei come "la definizione nello standard assicura che i nomi dichiarati nel corpo dello spazio dei nomi possano essere indicati nel corpo dello spazio dei nomi, qualificandoli completamente usando lo spazio dei nomi globale. Per esempio ..." –