Почему размещение const в левой части амперсанда допустимо при обращении к указателю, но не справа? - PullRequest
0 голосов
/ 16 июня 2020

Мне было интересно, почему эта строка считается действительной:

Entity* const & e = this; 

Но эта строка не является:

Entity* & const e = this;

Что на самом деле здесь делает амперсанд? Почему значение const слева от него допустимо, а справа - нет? Между прочим, эти строки являются частью конструктора в классе Entity.

Ответы [ 3 ]

4 голосов
/ 16 июня 2020

Что на самом деле делает здесь амперсанд?

Это знак пунктуации, который обозначает ссылочный тип. Это похоже на то, как звездочка обозначает тип указателя. все, что находится слева от него 1 . И если константа находится справа от амперсанда, тогда квалификатор будет применяться к ссылке. Но это не допускается языком. Константу нельзя применить к ссылке (в отличие от указателя). Такое уточнение было бы бессмысленным. Ссылки не могут быть изменены независимо.

В C ++ нет такой вещи, как ссылка на константу. Хотя в разговорной речи, «ссылка на константу» обычно используется, когда люди на самом деле имеют в виду ссылку на константу. справа const T& совпадает с T const &. Все это относится и к летучим.

3 голосов
/ 16 июня 2020

Entity* const & e = this; - это «ссылка на константный указатель на Entity».

Entity* & const e = this; будет «константной ссылкой на указатель на Entity», но ссылки не могут быть const 1 , вы получите сообщение об ошибке.


1 - После создания вы не можете «повторно привязать» ссылку, чтобы она указывала на другой объект. Из-за этого некоторые утверждают, что ссылки «всегда константны», но, по крайней мере, это вводит в заблуждение. std::is_const возвращает false для ссылок, поэтому формально они никогда не будут const.

2 голосов
/ 16 июня 2020

Указатель this объявляется следующим образом:

Entity* const this

, что означает, что это указатель на текущий объект, где значение самого указателя не может быть изменено (т.е. адрес, который this указывает на то, что не может быть изменено).

В первом примере вы объявляете переменную с именем e, которая является ссылкой на указатель сущности (const), то есть ссылкой на (неизменяемый) (указатель) на сущность, которая соответствует типу this .

Во втором примере вы объявляете ссылку на указатель сущности , где значение / адрес этого фактического указателя может измениться. Ключевое слово const здесь не определяет состояние адреса указателя, а скорее указывает, что сама ссылка не изменится, т.е. не будет ссылаться на новую сущность *.

Фактически, как уже указывалось, добавленная "const" для уточнения ссылки не будет компилироваться (поскольку она избыточна и не имеет смысла, ссылки не могут быть изменены), и поэтому следующее также неверно:

int x = 5;
int& const y = x;

Hope это помогло!

...