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