2013-04-03 24 views
9

di recente ho trovato la seguente definizione di funzione in un certo codice stavo rivedendo:Uso strano di const: perché viene compilato?

void func(const::std::string& str) 
{ 
    // Do something... 
} 

Mi sorprende che il const::std::string sembra essere legale (compila con GCC4.4, GCC 4.8, 3.2 Clang & Intel 13,0. 1).

Lo standard specifica che const può essere utilizzato come namespace?

+3

Sei sicuro, non è 'const :: std :: string ...' (nota lo spazio)? –

+0

@KirilKirov E che differenza fa lo spazio? La sequenza di token è indentica, con o senza lo spazio. –

+0

@JamesKanze: è l'operatore spaziale. oh bene un giorno di ritardo. ma in ogni caso. –

risposta

15

Lo standard specifica che const può essere utilizzato come spazio dei nomi?

No, non lo è, perché non può essere.

Il codice è lo stesso:

void func(const ::std::string& str); 

Il primo operatore di risoluzione dell'ambito denota namespace globale.

+1

Può essere sorprendente rispetto al parser C++ è solo * un po '* sensibile alle maiuscole ... –

6

viene analizzato come

const ::std::string& str 

dove ::std::string è un modo valido per riferirsi a std::string.

4

Ciò compila perché la sintassi è valutato come:

void func(const ::std::string& str) 

Il che significa che std è dichiarata in ambito globale. In questo contesto, un ulteriore :: prima di std è ridondante.

+1

"In questo contesto"? Cosa sappiamo del contesto. Forse questo è qualcosa come 'namespace Mine {namespace std {...}}'. (Non che io lo ritenga probabileE ogni programmatore che definisce uno spazio dei nomi annidato con il nome 'std' merita di essere girato.) –

+0

@JamesKanze," in questo contesto "... Ho usato queste parole perché, è abbastanza evidente che il codice avrebbe un' #include 'e il codice è in fase di compilazione. Quindi non abbiamo bisogno di un ambito globale esplicito '::' qui. Possiamo nidificare 'std' all'interno di qualsiasi altro spazio dei nomi, ma in questo caso il codice non verrà compilato (a meno che non si usi 'namespace Mine;'). – iammilind

Problemi correlati