Есть ли у ссылки место хранения?
У ссылки есть место хранения или это просто псевдоним для другого места? Отличается ли это редакцией C++ или это согласуется со всеми версиями C++? И если ссылка имеет место хранения, то разрешает ли она только семантику значений для указателя типа type?
Как будет работать ссылка, если вы используете ее как таковую:
struct aStruct{
int aVariable;
aClass& aReferencetoaClass;
};
Это занимает место или это псевдоним?
Ответы
Ответ 1
В самой последней спецификации C++ 20 (§ 9.2.3.3) и, по крайней мере, со времен спецификации спецификации C++ 2005:
Не указано, требуется ли ссылка для хранения
Фактическая реализация в каждом конкретном случае. Очевидно, что если у класса есть единственная переменная-член, которая является ссылкой, которую нужно где-то хранить. Но у компилятора есть свобода, когда вы используете ссылку исключительно как псевдоним, как вы выразились.
Ответ 2
Большинство компиляторов, для любого стандарта C++ вплоть до C++ 17 по крайней мере, эффективно реализуют ссылку в качестве указателя, если не оптимизированы.
В частности, внутри struct
он будет занимать размер указателя (плюс выравнивание/заполнение и т.д.).
Следовательно, это будет выполняться в большинстве сред:
struct S {
char & a;
};
static_assert(sizeof(S) == sizeof(void *));