Передача константного указателя по ссылке

Я смущен, что почему следующий код не может скомпилировать

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;
}
Другие вопросы по тегам