2012-08-27 12 views
22

que probé en dos compiladores, y se sorprendió al ver tanto compatibles con los siguientes definición sin queja:¿Por qué las cualificaciones de alcance redundante son compatibles con el compilador y es legal?

class A { 
    A(); 
}; 

A::A::A() {} 
    ^^^ 

Tenga en cuenta que esto también sucede para los métodos, a pesar de que se encuentra en posición cuando la declaración es sobre-calificado.

Preguntas:

  • Es ésta un programa válido en C++?
  • Si es así, ¿para qué sirve? ¿O es simplemente un subproducto?

Detalle Actualizado:

En caso de que la pregunta original no estaba claro o demasiado corto: Tengo curiosidad por qué se permiten las calificaciones redundantes en la definición (énfasis añadido también más arriba).


Clang de un Apple GCC 4.2 + LLVM fueron los compiladores

+1

Esto ha sido preguntado, pero creo que es más difícil de encontrar que algunos. – chris

+0

@chris miré algunas páginas, pero no encontré nada; me alegro de cerrar si se encuentra un dúplex. quizás simplemente no busqué utilizando los términos adecuados. – justin

+2

Esto * podría * ayudar: http://stackoverflow.com/questions/11423380/why-are-redundant-class-name-qualifiers-allowed – chris

Respuesta

18

sí, es permitidos (§ 9/2):

El nombre de clase también se inserta en el alcance de la clase en sí; esto se conoce como el nombre de clase inyectado. A los efectos de la verificación de acceso, el nombre de la clase inyectada se trata como si fuera un nombre de miembro público.

Para obtener información sobre el razonamiento que lleva al nombre de clase inject, es posible que desee leer N0444.

+0

gracias (+1) - He revisado la pregunta para enfatizar que la * definición * era la parte que fue realmente curiosa para mí (y me doy cuenta de que puede que no cambie tu respuesta). – justin

Cuestiones relacionadas