Как получить указатель на ссылочный член?

Рассмотрим этот код:

struct AA
{
    int& rr;
};

Есть ли способ получить указатель (или, возможно, ссылку) на AA::rr чтобы получить это?

AA* aa;
auto mm = &AA::rr; // error: cannot create pointer to reference member ‘AA::rr’
aa ->* mm;

Также в gcc-7.0.1decltype(AA::mm) просто int&, Это в соответствии со стандартом? И имеет ли это смысл?


РЕДАКТИРОВАТЬ

Извините, ребята, я сформулировал вопрос не совсем удачно. Нет претензий к тому факту, что ссылки не являются объектами или что нет такой вещи, как указатель на ссылку. Цель довольно эгоистична. Дано struct AA { int& rr; }; Я просто хочу иметь такую ​​функцию:

template < typename Class, typename Member >
void test(Member Class::*) { }

что при звонке test(&AA::rr) я хочу Class быть AA а также Member быть int& или же int, Поэтому мне даже не нужен сам указатель, а его тип, который позволит получить тип класса и тип члена.

2 ответа

Решение

Как получить указатель на ссылку (член)?

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

Когда вы применяете оператор addressof к ссылке, вы получаете адрес объекта, на который ссылаетесь.

Картина говорит тысячу слов

картина

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

Тем не менее, вы можете получить адрес ссылки, который является переменной, на которую он ссылается. В этом примере, если вы cout &rx и &x, они одинаковы.

Поэтому, вероятно, вы захотите получить указатель на объект, на который он ссылается, а не указатель на ссылку

Другие вопросы по тегам