Непоследовательное использование const квалификатора между объявлением и определением

Я заметил, что возможно иметьconst квалификатор аргумента значения присутствует в объявлении функции и затем опущен в определении. Это не меняет сигнатуру функции. Это на самом деле хорошо компилируется.

Я также заметил, что поведение между обычными и шаблонными классами отличается. Также есть разница между тем, как это обрабатывается в GCC и Clang.

Рассмотрим следующий код:

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

Когда я компилирую с GCC, я не получаю ошибок. С Clang я получаю:

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 отдает предпочтение определителю при определении. Clang использовал объявление и только для шаблона классаA.

Мои вопросы:

Регулируется ли это стандартом или определяется эта реализация?Почему поведение различается между обычными и шаблонными классами?Почему нет ошибки или хотя бы предупреждение о том, чтоconst квалификатор используется противоречиво между объявлением и определением?Есть ли ситуации, когда это может быть полезно?

Обновить:

Согласно комментариям, это похоже на ошибку Clang. Я открылновый билет.

Обновить:

Ошибка исправлена:

Исправлено в r203741

Ответы на вопрос(2)

Ваш ответ на вопрос