Адрес ссылки на разыменованный указатель совпадает с адресом указателя? - PullRequest
11 голосов
/ 19 мая 2011

В C ++ адрес ссылки на разыменованный указатель гарантированно совпадает с адресом указателя?

Или, записанное в коде, гарантируется ли следующее утверждение всегда верным?

SomeType *ptr = someAddress;
SomeType &ref = *ptr;
assert(&ref == ptr);

Ответы [ 4 ]

3 голосов
/ 19 мая 2011

Да, при условии, конечно, что someAddress не является нулевым указателем, или иначе не может быть разыменовано.В этом случае поведение не определено, хотя ваша реализация может вести себя так, как будто они равны, особенно при низких уровнях оптимизации.

Если вы хотите быть точным, тогда адрес &ref на самом деле не "ссылки ", это" адрес ссылки и ссылки ".Поскольку ref был привязан к *ptr, это означает, что реферад ref и реферранд (или, если хотите, pointee) из ptr являются одним и тем же объектом, и, следовательно, два адреса &ref и ptrравны.

И, как указывает Бо, вы сравниваете &ref с «значением указателя» или «адресом, хранящимся в указателе», а не «адресом указателя».указатель».

3 голосов
/ 19 мая 2011

Да, это правильно и всегда будет верно.

Ссылка - это не что иное, как псевдоним того типа, на который он ссылается. У него нет отдельного существования, оно всегда связано с тем, на которое оно ссылается.

2 голосов
/ 19 мая 2011

Да, если сама ссылка имеет адрес, она управляется реализацией и недоступна из кода. В любом случае, это просто другое имя для того же объекта.

1 голос
/ 19 мая 2011

Да, ваше понимание верно.И для 99. (9)% кода в мире ваш код будет правильным.Для педантов в аудитории (я в том числе), это утверждение не всегда верно:

SomeType *ptr = someAddress;
SomeType &ref = *ptr;
assert(&ref == ptr);

Рассмотрим эту программу:

#include <cassert>
struct SomeType { void* operator&() { return 0; } };
int main() {
  SomeType *ptr = new SomeType;
  SomeType &ref = *ptr;
  assert(&ref == ptr);
}
...