Niespójne użycie kwalifikatora const między deklaracją a definicją
Zauważyłem, że to możliweconst
kwalifikator na argumencie wartości występującym w deklaracji funkcji, a następnie pominięty w definicji. To nie zmienia podpisu funkcji. Właściwie dobrze się kompiluje.
Zauważyłem również, że zachowanie jest różne w klasach regularnych i szablonowych. Istnieje również różnica między tym, jak jest to obsługiwane w GCC i Clang.
Rozważ następujący kod:
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);
}
Kiedy kompiluję z GCC, nie mam błędów. Z Clang dostaję:
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 preferował kwalifikator w definicji. Clang używał deklaracji i tylko dla klasy szablonówA
.
Moje pytania to:
Czy jest to regulowane przez normę, czy jest to zdefiniowane?Dlaczego zachowanie różni się od klas regularnych i szablonowych?Dlaczego nie ma błędu lub przynajmniej ostrzeżenia, żeconst
kwalifikator jest używany niespójnie między deklaracją a definicją?Czy jest jakaś sytuacja, w której może to być przydatne?Aktualizacja:
Według komentarzy wydaje się być błędem Clang. Otworzyłem anowy bilet.
Aktualizacja:
Błąd został naprawiony:
Naprawiono w r203741