Работа ссылок с++

У меня возникло много вопросов, касательно ссылок? Вообщем, насколько я понял ссылка не является объектом

The following entities are not objects: value, reference, function, enumerator, type, non-static class member, template, class or function template specialization, namespace, parameter pack, and this.

Соответственно из этого можно сделать вывод, что она не хранится ни где в памяти, т. к. у нее нельзя взять адрес. Так же из определения ссылки:

Declares a named variable as a reference, that is, an alias to an already-existing object or function.

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

#define b_ref b
int b = 1;
cout << b_ref;

Будет в некоторой степени эквивалентно этому:

int b = 1;
int b_ref = b;
cout << b_ref;

P. s. я не говорю, что эти 2 примера полностью равны, я просто сравниваю работу ссылки с макросом, т. к. мне кажется, что тут присутствуют общие черты.

Но так-же есть еще и r-value ссылки. То есть сделав такую вещь:

int a&& = 1;

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

#define a 1

И получится так, что мы сможем хранить значение 1, не занимая при этом памяти. Не могли бы вы меня поправить, или как то дополнить все вышесказанное, заранее огромное спасибо:)


Ответы (1 шт):

Автор решения: HolyBlackCat

ссылка не является объектом

Да.

можно сделать вывод, что она не хранится ни где в памяти

Нет. Хотя они так хитро описаны в стаднате, под капотом у ссылок все равно указатели.1

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

То, что они не являются объектами, формально не дает вручную читать и менять составляющие их байты (адрес объекта, на который они указывают), и не дает использовать их в качестве элементов массивов (и еще чего-то).

В остальном это те же указатели1, но с другим интерфейсом.

она не хранится ни где в памяти, т. к. у нее нельзя взять адрес

Положите ее в структуру. Увидите, что размер структуры станет равным размеру указателя.1 Возьмите адрес структуры - чем не адрес ссылки? Формально это не ее адрес, да, она же не объект. Но если посмотреть, что по этому адресу - там скорее всего окажется указатель на то, на что указывает ссылка.

из определения ссылки: Declares a named variable as ... an alias to an already-existing object

Это вообще ничего не значит. Это просто "научно-популярное" определение.

То есть сделав такую вещь:

int a&& = 1;

Мы не будем создавать, переменную, которая занимает некоторое место в памяти

Единственная переменная здесь - ссылка a. Но объект типа int все равно существует.

1, как prvalue, объектом не является. Но попытка инициализировать им ссылку "материализует" его (подвергает temporary materialization) что делает его xvalue - вполне реальным объектом типа int.

У a даже адрес можно взять.


1 Стандарт не гарантирует, что у ссылок под капотом указатели, но на практике это так. Не видел и не слышал ни про один компилятор, который делал бы по-другому.

→ Ссылка