Подтвердить что ты не робот

Ссылка в С++

Я вижу код в StackOverflow каждый раз в то время, спрашивая о некоторой неоднозначности перегрузки с чем-то, включающим функцию вроде:

void foo(int&& param);

Мой вопрос: почему это даже пришло? Вернее, когда у вас когда-нибудь будет "ссылка на ссылку"? Как это отличается от простой старой ссылки? Я никогда не сталкивался с этим в реальном коде, поэтому мне любопытно, какой код понадобится для этого.

4b9b3361

Ответ 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.