Является ли значение указателя `this` постоянным в течение всего времени существования объекта? - PullRequest
19 голосов
/ 15 января 2020

Гарантируется ли значение указателя this постоянным в течение жизни определенного объекта? Я не могу представить себе случай, когда это изменится, но не знаю, не пропустил ли я что-то.

Ответы [ 3 ]

27 голосов
/ 15 января 2020

Гарантируется ли значение указателя this постоянным в течение жизни определенного объекта?

Да .

Как пользователь Aconcagua выражает это: значение this указатель всегда является значением адреса объекта, для которого была вызвана функция 1 . Таким образом, вопрос эквивалентен:

Может ли объект изменять адрес своей памяти в течение времени жизни?

Это невозможно по определению lifetime 2 . Время жизни объекта начинается, когда или после того, как его хранение получено, и заканчивается до того момента, когда он выпущен.


1) [class.this]/1

В теле функции-члена non-stati c ([class.mfct]) ключевое слово this представляет собой prvalue , значением которого является указатель на объект, для которого вызывается функция.

2) [basic.life]/1 (выделено мной)

Время жизни объекта или ссылка - это свойство времени выполнения объекта или ссылки. Говорят, что переменная имеет незаполненную инициализацию, если она инициализирована по умолчанию, и, если она имеет тип класса или (возможно, многомерный) массив, этот тип класса имеет тривиальный конструктор по умолчанию. Время жизни объекта типа T начинается, когда :

  • хранилище с правильным выравниванием и размером для типа T равно и
  • его инициализация (если есть) завершена (включая пустую инициализацию) ([dcl.init]), за исключением того, что если объект является членом объединения или подобъектом, его время жизни начинается только в том случае, если Член объединения является инициализированным членом объединения ([dcl.init.aggr], [class.base.init]) или как описано в [class.union].

Время жизни объекта o типа T заканчивается, когда :

  • , если T не является типом класса, объект уничтожается, или
  • , если T является типом класса, начинается вызов деструктора, или
  • хранилище, которое занимает объект, освобождается или используется объектом, который не вложен в o ([intro.object]).
8 голосов
/ 15 января 2020

У объекта есть область хранения. this очков там.

[intro.object]/1

Объект занимает область хранения в период его строительства ([class.cdtor]), на протяжении всей своей жизни и в период разрушения ([class.cdtor]).

0 голосов
/ 23 января 2020

Значение this гарантированно будет постоянным, если программа когда-либо его считывает, если впоследствии некоторые биты значения чтения невозможно собрать мусором или если впоследствии некоторые биты значения чтения вышли за пределы программы. Во всех других случаях он ведет себя как кот Шредингера, то есть он постоянен и изменчив одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...