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.
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. –