Ссылка в С++
Я вижу код в StackOverflow каждый раз в то время, спрашивая о некоторой неоднозначности перегрузки с чем-то, включающим функцию вроде:
void foo(int&& param);
Мой вопрос: почему это даже пришло? Вернее, когда у вас когда-нибудь будет "ссылка на ссылку"? Как это отличается от простой старой ссылки? Я никогда не сталкивался с этим в реальном коде, поэтому мне любопытно, какой код понадобится для этого.
Ответы
Ответ 1
Это ссылка rvalue, Bjarne описывает ее здесь.
Бесстыдное копирование ( "цитирование" ):
Ссылка rvalue
Ссылка rvalue представляет собой составной тип очень похож на С++ традиционный Справка. Чтобы лучше различать эти два типа, мы ссылаемся на традиционный Ссылка С++ как ссылка lvalue. Когда используется термин "ссылка", относится к обоим типам ссылок: lvalue reference и rvalue.
Ссылка на lvalue формируется размещение и после некоторого типа.
A a; A& a_ref1 = a; // an lvalue reference
Ссылка rvalue формируется размещение && после какой-то тип.
A a; A&& a_ref2 = a; // an rvalue reference
Ссылка rvalue ведет себя так же, как ссылка на lvalue, за исключением того, что она может привязать к временному (rvalue), тогда как вы не можете связывать (не const) lvalue ссылается на rvalue.
A& a_ref3 = A(); // Error!
A&& a_ref4 = A(); // Ok
Ответ 2
Это не ссылка на ссылку: такой вещи не существует.
Это ссылка rvalue, новая функция, добавленная в стандартизированный С++ 11.
Ответ 3
Это ссылка rvalue. Обратите внимание, что токен &&
, используемый для ссылок Boolean AND и rvalue, и токен &
, используемый для побитовых И и нормальных ссылок, - это разные слова, насколько это может сказать язык.
Ссылка на rvalue (обычно) связана с объектом, который может быть оставлен в неопределенном состоянии после завершения задания rvalue, предположительно потому, что объект будет уничтожен.
Проще говоря, привязка переменной к ссылке rvalue - это обычно последнее, что вы делаете с ней.
В отличие от обычной ссылки, но как ссылка const &
, ссылка rvalue может связываться с rvalue (выражение, адрес которого не может быть непосредственно принят). Подобно регулярной ссылке, но в отличие от ссылки const &
, для изменения своего объекта может использоваться ссылка rvalue.