Выражение
TYPE& == *(TYPE const *)
выглядит немного ошибок домена, как TYPE&
является типом в то время как *(TYPE const*)
выглядит как выражение применяется к типу. По крайней мере, правая сторона должна быть указателем const
, а не указателем на const
, т.е.:
A TYPE&
ведет себя как авто-разыменовываются неизменным указатель, что-то вроде *(TYPE* const)
с неявным ограничением, что указатель не может быть пустым.
Компилятор делает распознает ссылки, а в некоторых случаях, а именно, когда связывающий временные переменные в качестве ссылки на const
объекта (T const&
) в области видимости функции: срок времени временного получает расширяется до тех пор, ссылка не выходит из области видимости ! Например:
{
std::string const& s = std::string("longer lived");
// the original temporary created above still lives
} // <-- ... and gets destroyed when s goes out of scope here
Еще одно важное различие между указателями и ссылками являются семантика, когда речь идет о перегрузкой операторов: указатели рассмотрим встроенные типы и операторы с участием только встроенные типы не могут быть перегружены. Ссылка типа T&
ведет себя как объект T
, то есть перегруженные операторы для T&
. То есть, хотя a T&
идентичен использованию T* const
с точки зрения представления, компилятор понимает разницу и рассматривает объекты по-разному на семантическом уровне.
Что значит ВСЕГДА? –
@PranitKothari при любых обстоятельствах и в любых ситуациях. –
Это не везде * рядом * ВСЕГДА эквивалент. Во-первых, разыменовывает const-указатель на объект const, * не * совместим с неконстантной ссылкой, поэтому он даже не * юридический *. Почему вы решили ввести «const» в это? – WhozCraig