Есть ли у ссылки место хранения? - PullRequest
23 голосов
/ 01 июля 2019

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

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

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

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

Ответы [ 2 ]

16 голосов
/ 01 июля 2019

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

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

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

10 голосов
/ 01 июля 2019

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

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

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

struct S {
    char & a;
};

static_assert(sizeof(S) == sizeof(void *));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...