Работа ссылок с++
У меня возникло много вопросов, касательно ссылок? Вообщем, насколько я понял ссылка не является объектом
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 шт):
ссылка не является объектом
Да.
можно сделать вывод, что она не хранится ни где в памяти
Нет. Хотя они так хитро описаны в стаднате, под капотом у ссылок все равно указатели.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 Стандарт не гарантирует, что у ссылок под капотом указатели, но на практике это так. Не видел и не слышал ни про один компилятор, который делал бы по-другому.