Передача константного указателя по ссылке
Я смущен, что почему следующий код не может скомпилировать
int foo(const float* &a) {
return 0;
}
int main() {
float* a;
foo(a);
return 0;
}
Компилятор выдает ошибку как:
ошибка: неверная инициализация ссылки типа 'const float*&' из выражения типа 'float*'
но когда я пытаюсь пройти без ссылки в foo, он компилируется нормально.
Я думаю, что это должно показать одинаковое поведение, независимо от того, перейду я по ссылке или нет.
Спасибо,
1 ответ
Решение
Потому что это небезопасно. Рассматривать:
const float f = 2.0;
int foo(const float* &a) {
a = &f;
return 0;
}
int main() {
float* a;
foo(a);
*a = 7.0;
return 0;
}
Любой неconst
ссылка или указатель обязательно должны быть инвариантными в указанном типе, потому что неconst
указатель или ссылка поддерживает чтение (ковариантная операция), а также запись (контравариантная операция).
const
должен быть добавлен сначала от наибольшего уровня косвенности. Это будет работать:
int foo(float* const &a) {
return 0;
}
int main() {
float* a;
foo(a);
return 0;
}