Почему в C ++ нет ссылки на const, как указатель на const - PullRequest
3 голосов
/ 08 января 2020
int main()
{
    int        n = 1;
    int* const p = &n; // ok

    *p = 2; // ok as expected. 
    p  = 0; // error as expected.

    int& const m = n; 
    // error: 'const' qualifier may not be
    // applied to a reference   

    return 0;
}

Почему в C ++ отсутствует ссылка на const, как указатель на const?

Каково обоснование дизайна?

Ответы [ 3 ]

6 голосов
/ 08 января 2020

Ссылки в C ++ отличаются от указателей несколькими существенными способами. Одно из различий заключается в следующем:

Как только ссылка создана, она не может быть позже сделана для ссылки на другой объект; это не может быть повторно установлено. Это часто делается с помощью указателей.

Это означает, что Reference похожи похожи (см. Ссылку в конце этого ответа) на константный указатель ( не указатель const! ) в C ++ ...

int a = 5;
int& m = a; // Behaves similar to int * const m = &a;
// See the link at the bottom for the differences between const pointer and reference.

и, следовательно, вы не можете изменить / привязать их, чтобы они указывали на какой-то другой адрес. Таким образом, вам не нужен явный квалификатор const для ссылки, и поэтому он запрещен компилятором.

См. Эту ссылку для изучения Why are references not reseatable in C++?. Я скопировал принятый ответ по вышеуказанной ссылке:

Причина, по которой C ++ не позволяет перепривязывать ссылки, приведена в «Построении и эволюции C ++» Страуструпа:

It невозможно изменить то, на что ссылается ссылка после инициализации. То есть, после инициализации ссылки на C ++ невозможно сделать ссылку на другой объект позже; это не может быть повторно связано. В прошлом меня укусили ссылки Algol68, где r1 = r2 может либо назначить через r1 объект, на который ссылаются, либо назначить новое ссылочное значение для r1 (повторное связывание r1) в зависимости от типа r2. Я хотел избежать таких проблем в C ++.

РЕДАКТИРОВАТЬ:

См. эту ссылку для Difference between const pointer and reference? (Спасибо @MM за указание на двусмысленность в моем утверждении).

4 голосов
/ 08 января 2020

Почему в C ++ отсутствует ссылка на const, как указатель на const?

Ссылки не могут быть изменены. Добавление квалификации const к неизменяемой сущности было бы бессмысленным и запутанным.

Обратите внимание, что технически возможно применять const к ссылке косвенно через псевдоним типа или аргумент типа шаблона. Пример:

T some_t;
using Ref = T&;
Ref const some_ref = some_t; // well-formed

Ref const тип "сворачивается" в T& и такой же, как неквалифицированный Ref. Я рекомендую вообще избегать создания псевдонимов типов для указателей и ссылок, за исключением редких случаев, когда они являются обычными. В частности, псевдоним типа Container::reference и подобные ему являются обычными.

2 голосов
/ 08 января 2020
  int& const m = n; 

ИМХО, поскольку он по своей природе постоянен по природе компилятора, просто

 int n ; 

n имеет внутреннюю постоянную ссылку

, так как при разборе кодов он просто определяет, в какое место Определитель const допускается только при наличии метода правила компилятора для анализа, если не разрешен, то go to error / warning

...