Uso inconsistente del calificador const entre declaración y definición
Noté que es posible tenerconst
calificador en un argumento de valor presente en la declaración de función y luego se omite en la definición. Eso no cambia la firma de la función. En realidad compila bien.
También noté que el comportamiento es diferente entre las clases regulares y las de plantilla. También hay una diferencia entre cómo se maneja en GCC y Clang.
Considere el siguiente código:
template <typename T> struct A {
void f(const int);
};
template <typename T> void A<T>::f(int x) {
x = 0;
}
struct B {
void f(const int);
};
void B::f(int x) {
x = 0;
}
void f() {
A<float> a;
a.f(0);
B b;
b.f(0);
}
Cuando compilo con GCC no obtengo errores. Con Clang obtengo:
test.cpp:10:7: error: read-only variable is not assignable
x = 0;
~ ^
test.cpp:26:7: note: in instantiation of member function 'A<float>::f' requested here
a.f(0);
^
GCC tomó la preferencia del calificador en la definición. Clang usó la declaración y solo para la clase de plantillaA
.
Mis preguntas son:
¿Está regulado por la norma o está definida esta implementación?¿Por qué el comportamiento es diferente entre las clases regulares y las de plantilla?¿Por qué no hay error o al menos una advertencia de que elconst
¿El calificador se usa de manera inconsistente entre la declaración y la definición?¿Hay alguna situación en la que esto pueda ser útil?Actualizar:
Según los comentarios, parece ser un error de Clang. Abrí unnuevo boleto.
Actualizar:
El error está arreglado:
Reparado en r203741