Sí, es legal. El nombre de una clase se inserta en su propio espacio de nombres, que se llama injected-class-name. De C++ 03 § 9/2:
[...] El nombre de clasetambién se inserta en el ámbito de aplicación de la clase en sí; esto se conoce como injected-class-name. Para fines de verificación de acceso, nombre de clase inyectada se trata como si fuera un nombre de miembro público.
Tenga en cuenta que los nombres Log::Log
el constructor de la clase, que sólo se permite en ciertos contextos, pero siempre y cuando se termina la cadena de Log::Log::...
con algo más que Log
(como fn
), entonces no tiene el nombre del constructor. Específicamente, §3.4.3.1/1a dice:
Si el anidada-nombre-especificador designa una clase C
, y el nombre especificado después de la nombre-nested-especificador, cuando alzó la vista en C
, es el nombre-clase-inyectado de C
(cláusula 9), se considera que el nombre es el nombre del constructor de la clase C
. Tal nombre de constructor se usará solo en el declarator-id de una definición de constructor que aparece fuera de la definición de clase.
Nota al margen: Esto no se compilará en VC10. Sin embargo, así como un código de aceptación de compilador no prueba que es legal, también solo porque un compilador rechaza el código no significa que sea ilegal. –