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

Respuestas a la pregunta(2)

Su respuesta a la pregunta