В опубликованном вами коде &x
является значением r, поэтому, если вы хотите захватить ссылку на него, вы должны захватить его с помощью константной ссылки.
Что вам нужно, это int* const& b = &x
.
Правило, которое я выучил, которое до сих пор хорошо мне помогает, - это читать декларацию справа налево, чтобы понять constness . В этом случае вы читаете что-то вроде « b - это ссылка на константный указатель на int ».
Ссылки должны ссылаться на переменные (то есть именованный экземпляр типа). Const ссылки могут ссылаться на временные объекты / безымянные переменные. Э.Г.
int x = 5; // x is a named instance of an int
int* p = &x;
int*& y = p; // the reference y is referring to the named variable p which is a pointer to an int.
int*& z = &x; // not ok because x is a named variable but "&x" is not, so a reference cannot refer to it.
int* const& w = &x; // ok because w is a const reference, not a reference.
Надеюсь, это поможет. Потратьте некоторое время онлайн, читая о ссылках и правильности const, и это все гель. Здесь есть много замечательных вопросов и ответов по этим двум темам.
Это хорошая статья, в которой обсуждаются lvalues и rvalues: Что такое rvalues, lvalues, xvalues, glvalues и prvalues?