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

questionAnswers(2)

yourAnswerToTheQuestion