«Я знаю, что компиляторы реализуют ссылки как указатели»
Нет, они не делают.Это распространенный источник путаницы.Когда вы делаете это:
int p;
int *r = &p;
Вы создаете, скажем, 32-битный указатель в память, который вы можете использовать для манипулирования данными.
Однако, когда вы делаете это:
int p;
int& r = p;
Вы не используете указатель на p.Есть объект p, который может находиться в регистре, стеке или куче, это не важно.Объявление означает, что r также ссылается на тот же объект.Это не указатель на объект: если сделать указатель, вы создаете новый объект.Вы говорите "г указывает на р."Однако, используя ссылку, вы говорите "r is p."Новый объект не создается (указатель).Для всех намерений и целей int & r равно p, потому что любое его использование ссылается на (не указывает на) стр.
Позвольте мне выразиться так:
Это как сказать, что есть этот человек, Дэйв.Он живет по (вымышленному адресу)
Это указывает на Дейва.
И затем у него есть псевдоним OrgnlDave.
OrgnlDave не указывает на Дейва, это это Дейв, это просто еще один способ сказать это.Есть только один Дейв.Сказать «привет, OrgnlDave» - это то же самое, что сказать «привет, Дейв», что отличается от отправки письма Дейву.
В псевдокоде
person Dave;
address(Dave, made-up-address) pointer;
person& OrgnlDave means Dave; // and we indicate that by using the &
Hi(pointer); // Sends Dave a cordial letter
Hi(Dave); // Says hi to Dave
Hi(OrgnlDave); // Says hi to Dave