Непоследовательное использование 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