Почему 'this' - это указатель, а не ссылка?

Я читал ответы на этот вопрос плюсы и минусы С++ и получил это сомнение при чтении комментариев.

Программисты

часто сбивают с толку, что "this" является указателем, но не ссылкой. другая путаница заключается в том, почему "привет" не имеет тип std::string, а оценивает char const * (указатель) (после преобразования массива в указатель) - Johannes Schaub - litb Dec 22 '08 at 1:56

Это только показывает, что он не использует те же соглашения, что и другие (более поздние) языки. - le dorfier дек. 22 '08 в 3:35

Я бы назвал "this" вещь довольно тривиальной проблемой. И, к сожалению, спасибо за ловушку нескольких ошибок в моих примерах поведения undefined.:) Хотя я не понимаю, какая информация о размере имеет отношение к чему-либо в первом. Указателю просто не разрешено указывать внешнюю выделенную память - jalf Dec 22 '08 at 4:18

Является ли это постоянным выводом? - yesraaj Дек 22 '08 в 6:35

это может быть константой, если метод const int getFoo() const; < - в области getFoo, "this" является константой и, следовательно, является readonly. Это предотвращает ошибки и предоставляет определенный уровень гарантии вызывающему, что объект не изменится. - Doug T. Dec 22 '08 в 16:42

вы не можете переназначить "this". т.е. вы не можете сделать "this = & other;", потому что это rvalue. но это тип T *, а не типа T const. т.е. это непостоянный указатель. если вы находитесь в методе const, то это указатель на const. T const. но сам указатель неконст. - Johannes Schaub - litb Dec 22 '08 at 17:53

подумайте о "this" следующим образом: #define this (this_ + 0), где компилятор создает "this_" в качестве указателя на объект и делает "this" ключевое слово. вы не можете назначить "this", потому что (this_ + 0) является rvalue. конечно, не так, как есть (такого макроса нет), но он может помочь понять это - Johannes Schaub - litb 22 дек 2008 в 17:55

Мой вопрос в том, почему this является указателем a не ссылкой? Любая конкретная причина для его указателя?


Некоторые дополнительные аргументы, почему this является ссылкой, имеет смысл:

  • Рассмотрим Item 1 из More Effective C++: используйте ссылки, когда гарантируется, что у нас есть действительный объект, т.е. не NULL (моя интерпретация).
  • Кроме того, ссылки считаются более безопасными, чем указатели (потому что мы не можем прикрутить память с помощью блуждающего указателя).
  • В-третьих, синтаксис доступа к ссылкам (.) немного приятнее и короче, чем доступ к указателям (-> или (*)).

Ответ 1

Когда язык был впервые развит, в ранних выпусках с реальными пользователями не было ссылок, только указателей. Ссылки были добавлены, когда была добавлена ​​перегрузка оператора, так как для этого требуются непрерывные ссылки.

Одним из видов использования this является то, что объект получает указатель на себя. Если бы это была ссылка, нам пришлось бы писать &this. С другой стороны, когда мы пишем оператор присваивания, мы должны return *this, который выглядел бы проще, чем return this. Поэтому, если у вас был пустой сланец, вы можете поспорить об этом в любом случае. Но С++ постепенно эволюционировала в ответ на отзывы сообщества пользователей (как и большинство успешных вещей). Значение обратной совместимости полностью подавляет незначительные преимущества/недостатки, вытекающие из this, являющегося ссылкой или указателем.

Ответ 2

Немного поздно на вечеринку... Прямо от устья лошади, вот что должен сказать Stroupstrup (что по существу повторяется в или взятый из книги "Дизайн и эволюция С++" ):

Почему "this" не ссылка?

Потому что "this" был введен в С++ (действительно в C с классами), прежде чем ссылки были добавлены. Кроме того, я выбрал "this" для использования Simula, а не для использования (далее) Smalltalk "я".

Ответ 3

В стандарте С++ указано, что

9.3.2/1

В теле нестатического (9.3) функция-член, ключевое слово this это выражение не-lvalue, значение которого равно адрес объекта, для которого функция вызывается. Тип это в членной функции класса X X *. Если функция-член объявленный const, тип этого const X *, если функция-член объявленный volatile, тип этого летучих X *, и если член функция объявлена ​​const volatile, тип этого является константой volatile X *.

Но в других ссылках было найдено что-то еще... поэтому кто-то взял инициативу и расстрелял почту Mr. Страуструп. Последовавший разговор можно найти здесь.

Ответ 4

Независимо от того, как мы сюда попали, мне кажется, что это повезло, что это указатель, а не ссылка, так как это помогает "понять", что вы можете его удалить:

void A::f () {
  delete &this;
}

Я думаю, что это случай, когда не обязательно по дизайну, С++ лучше, чем есть.