Как получить указатель на ссылочный член?
Рассмотрим этот код:
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.1
decltype(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, они одинаковы.
Поэтому, вероятно, вы захотите получить указатель на объект, на который он ссылается, а не указатель на ссылку