2012-10-11 12 views
9

Duplicar posible:
Why are redundant scope qualifications supported by the compiler, and is it legal?¿Está bien especificar un alcance de clase C++ duplicado?

no me esperaba esto para compilar pero lo hace. ¿Podría ser esto un error del compilador o tiene algún significado correcto?

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

Respuesta

9

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.

+2

Es absolutamente legal. Intenta compilarlo. – meagar

+2

@John: ¿Por qué todavía dudas de que sea legal después de ver citas del estándar de lenguaje C++ y después de que varios compiladores lo acepten sin advertencias/errores? –

+0

Es legal porque es un comportamiento definido, documentado en la especificación. – meagar

Cuestiones relacionadas