2012-10-11 13 views
9

Powiel możliwe:
Why are redundant scope qualifications supported by the compiler, and is it legal?Czy można określić duplikat zakresu klasy C++?

nie spodziewałbym się to skompilować, ale robi. Czy może to być błąd kompilatora, czy ma jakieś poprawne znaczenie?

$ g++ -c scopes.cpp 
$ cat scopes.cpp 
class Log { 
public: 
    Log() { } 
    static void fn() { } 
}; 

void test() { 
    Log::Log::Log::Log::Log::Log::fn(); 
} 

$ g++ --version 
g++ (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3 
+0

Nota boczna: Nie zostanie skompilowana pod VC10. Jednakże, tak jak kod akceptujący kod nie dowodzi, że jest legalny, również dlatego, że kompilator odrzuca kod, nie oznacza, że ​​jest on nielegalny. –

Odpowiedz

9

Tak, jest to zgodne z prawem. Nazwa klasy jest wstawiana do jej własnej przestrzeni nazw, która nazywa się nazwą klasy wtryskiwanej. Spośród takich jak C++ 03 §9/2:

[...] Klasa nazwajest również wkładany do zakresu samego rodzaju; jest to znane jako nazwa klasy wtryskiwanej. Do celów sprawdzania dostępu nazwa o nazwie typu wstrzykiwanego jest traktowana jak nazwa publiczna.

Zauważ, że Log::Log nazwiska konstruktora klasy, która jest dozwolona tylko w pewnych kontekstach, ale tak długo, jak zakończyć łańcuch Log::Log::... z czymś innym niż Log (takich jak fn), to nie nadaj nazwę konstruktor. Konkretnie §3.4.3.1/1a mówi:

Jeśli nested-name-specifier wyznacza klasę C oraz nazwę określony po nested-NAME specyfikatorem, gdy spojrzał w C , jest nazwą klasy wtryskiwanej C (klauzula 9), zamiast tego nazwa jest uznawana za nazwę konstruktora klasy C. Taka nazwa konstruktora będzie używana tylko w deklarator-id definicji konstruktora , która pojawia się poza definicją klasy.

+2

Jest to całkowicie legalne. Spróbuj go skompilować. – meagar

+2

@John: Dlaczego wciąż wątpisz, że jest to legalne po zobaczeniu cytowań ze standardu języka C++ i po zaakceptowaniu przez wiele kompilatorów bez ostrzeżeń/błędów? –

+0

Jest to zgodne z prawem, ponieważ jest to określone zachowanie, udokumentowane w specyfikacji. – meagar

Powiązane problemy