2013-04-03 13 views
9

Niedawno znalazłem następującą definicję funkcji w pewnym kodzie miałem przeglądu:Dziwne użycie const - dlaczego to się kompiluje?

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

Jestem zaskoczony, że const::std::string wydaje się być legalne (kompiluje z GCC4.4, GCC 4.8, Clang 3.2 & Intel 13.0. 1).

Czy standard określa, że ​​const może być używany jako?

+3

Czy jesteś pewien, że to nie jest "const :: std :: string ..." (zwróć uwagę na spację)? –

+0

@KirilKirov A czym różni się przestrzeń? Sekwencja tokenów jest indentyczna, z przestrzenią lub bez niej. –

+0

@JamesKanze: to operator przestrzeni. no cóż, jeden dzień późno. ale w każdym razie. –

Odpowiedz

15

Czy standard określa, że ​​const może być używany jako przestrzeń nazw?

Nie, nie, ponieważ nie może być.

Twój kod jest taki sam jak:

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

Pierwszy operator rozdzielczości zakres oznacza globalną przestrzeń nazw.

+1

Może to być zaskakujące, ponieważ parser C++ jest tylko * nieco * rozróżniany wielkość liter ... –

6

To jest analizowany jako

const ::std::string& str 

gdzie ::std::string jest poprawny sposób nawiązać do std::string.

4

To kompiluje ponieważ składnia jest oceniany jako:

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

co oznacza, że ​​std jest zadeklarowana w zakresie globalnym. W tym kontekście dodatkowy nadmiarowy :: jest zbędny.

+1

"W tym kontekście"? Co wiemy o kontekście. Może to jest coś w stylu 'namespace Mine {namespace std {...}}'. (Nie sądzę, że to prawdopodobne.I każdy programista, który definiuje zagnieżdżoną przestrzeń nazw o nazwie 'std', zasługuje by zostać postrzelonym.) –

+0

@JamesKanze," w tym kontekście "... Użyłem tych słów, ponieważ jest całkiem oczywiste, że kod zawierałby' #include 'a kod kompiluje się dobrze. Dlatego nie potrzebujemy tutaj wyraźnego zakresu globalnego "::". Możemy zagnieździć 'std' wewnątrz jakiejkolwiek innej przestrzeni nazw, ale w tym przypadku kod nie będzie się kompilował (chyba że' using namespace Mine; '). – iammilind

Powiązane problemy