Inkonsistente Verwendung des const-Qualifiers zwischen Deklaration und Definition

Mir ist aufgefallen, dass es möglich istconst Qualifizierer für ein Wertargument, das in der Funktionsdeklaration vorhanden ist und dann in der Definition weggelassen wird. Das ändert nichts an der Signatur der Funktion. Es lässt sich tatsächlich gut kompilieren.

Mir ist auch aufgefallen, dass sich das Verhalten zwischen regulären Klassen und Vorlagenklassen unterscheidet. Es gibt auch einen Unterschied, wie es in GCC und Clang gehandhabt wird.

Betrachten Sie den folgenden Code:

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);
}

Wenn ich mit GCC kompiliere, erhalte ich keine Fehler. Mit Clang bekomme ich:

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 hat den Qualifier bei der Definition bevorzugt. Clang verwendete die Deklaration und nur für die Template-KlasseA.

Meine Fragen sind:

Ist dies durch die Norm geregelt oder ist diese Implementierung definiert?Warum unterscheidet sich das Verhalten zwischen regulären Klassen und Vorlagenklassen?Warum gibt es keinen Fehler oder zumindest eine Warnung, dass dieconst Qualifier wird inkonsistent zwischen Deklaration und Definition verwendet?Gibt es eine Situation, in der dies nützlich sein könnte?

Aktualisieren:

Den Kommentaren zufolge scheint es sich um einen Clang-Bug zu handeln. Ich öffnete einneues Ticket.

Aktualisieren:

Der Fehler ist behoben:

Behoben in r203741

Antworten auf die Frage(2)

Ihre Antwort auf die Frage