Uso inconsistente do qualificador const entre declaração e definição

Eu percebi que é possível terconst qualificador em um argumento de valor presente na declaração de função e, em seguida, omitido na definição. Isso não altera a assinatura da função. Na verdade compila bem.

Também notei que o comportamento é diferente entre classes regulares e de modelo. Também há uma diferença entre como é tratado no GCC e no Clang.

Considere o seguinte 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);
}

Quando eu compilo com o GCC não recebo erros. Com o Clang eu recebo:

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

O GCC tomou preferência do qualificador na definição. Clang usou a declaração e apenas para a classe de modeloA.

Minhas perguntas são:

Isso é regulado pela norma ou esta implementação é definida?Por que o comportamento é diferente entre classes regulares e de modelo?Por que não há erro ou pelo menos um aviso de que oconst qualificador é usado inconsistentemente entre a declaração e a definição?Existe alguma situação em que isso possa ser útil?

Atualizar:

De acordo com os comentários, parece ser um erro do Clang. Eu abri umnovo ingresso.

Atualizar:

O bug foi corrigido:

Fixo em r203741

questionAnswers(2)

yourAnswerToTheQuestion