Я заметил, что возможно иметь квалификатор 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 предпочла классификатор при определении. Кланг использовал объявление и только для класса шаблона A
.
Мои вопросы:
- Является ли это регулируемым стандартом или эта реализация определена?
- Почему поведение отличается от обычного и шаблонного классов?
- Почему нет ошибки или, по крайней мере, предупреждения о том, что квалификатор
const
используется несогласованно между объявлением и определением? - Есть ли ситуация, когда это может быть полезно?
Update:
Согласно комментариям, это, по-видимому, ошибка Clang. Я открыл новый новый билет.
Update:
Исправлена ошибка:
Исправлено в r203741