Есть ли у ссылки место хранения? - программирование

Есть ли у ссылки место хранения?

У ссылки есть место хранения или это просто псевдоним для другого места? Отличается ли это редакцией C++ или это согласуется со всеми версиями C++? И если ссылка имеет место хранения, то разрешает ли она только семантику значений для указателя типа type?

Как будет работать ссылка, если вы используете ее как таковую:

struct aStruct{
   int aVariable;
   aClass& aReferencetoaClass;
};

Это занимает место или это псевдоним?

4b9b3361

Ответ 1

В самой последней спецификации C++ 20 (§ 9.2.3.3) и, по крайней мере, со времен спецификации спецификации C++ 2005:

Не указано, требуется ли ссылка для хранения

Фактическая реализация в каждом конкретном случае. Очевидно, что если у класса есть единственная переменная-член, которая является ссылкой, которую нужно где-то хранить. Но у компилятора есть свобода, когда вы используете ссылку исключительно как псевдоним, как вы выразились.

Ответ 2

Большинство компиляторов, для любого стандарта C++ вплоть до C++ 17 по крайней мере, эффективно реализуют ссылку в качестве указателя, если не оптимизированы.

В частности, внутри struct он будет занимать размер указателя (плюс выравнивание/заполнение и т.д.).

Следовательно, это будет выполняться в большинстве сред:

struct S {
    char & a;
};

static_assert(sizeof(S) == sizeof(void *));