plusplus - Clases base calificadas para CV en C++
c++ website (2)
La gramática lo prohíbe. Las clases base se especifican con la producción de la cláusula base especificada al comienzo de la sección 10 de la norma. Finalmente, se resuelve en el tipo de base-especificador , que es clase-o-decltype , que es una construcción de tipo
decltype
o un nombre de clase anidada-especificador [opt] . Tenga en cuenta que esto no deja lugar para un cv-specifier.El nombre typedef encaja en la gramática. 9.1 / 5 dice "Un nombre de typedef que nombra un tipo de clase, o una versión calificada de cv del mismo, también es un nombre de clase". La const es simplemente ignorada.
La const es simplemente ignorada. Los subobjetos de la clase base no pueden ser constantes por sí mismos. 9.1 / 5 dice "Si se utiliza un typedef-name que nombra un tipo de clase calificado por el CV cuando se requiere un nombre de clase, se ignoran los calificadores del cv".
Mientras refactorizaba un código C ++ 11, me topé con algo extraño. Es decir, parece que es imposible definir una clase base calificada para CV ( const
, volatile
o const volatile
), por ejemplo:
struct A { int a = 0; };
struct B: A const {}; // Error here with Clang and GCC!
Sin embargo, lo siguiente compila sin errores:
struct A { int a = 0; };
using AC = A const;
struct B: AC {}; // NO ERROR HERE!? Qualifiers are ignored.
int main() {
B b;
b.a = 42; // NO ERROR modifying a field of const base.
return b.a;
}
Tengo dos preguntas:
- ¿Qué en los estándares de C ++ prohíbe la definición de una clase base calificada para CV, en todo caso?
- ¿Por qué compila el segundo ejemplo?
PD: Ya que esta es una pregunta de abogado de idioma , por favor proporcione referencias al estándar C ++.
En realidad, es el objeto completo que creas lo que es constante o no constante, las clases no están calificadas para CV.
En el using AC = A const;
la const es simplemente ignorada cuando se usa para heredar.