Есть ли смысл называть локальную переменную rvalue-ref? - PullRequest
2 голосов
/ 20 декабря 2011

Если код компилируется , есть ли разница между:

A && a = .....

и

A &  a = .....

? a - это локальная переменная в функции или методе, а не параметр.

Если присвоить rvalue-reference имя (a), оно фактически станет lvalue для остальной области видимости? то есть даже с предыдущей формой вам придется использовать move(a), чтобы включить воровство при передаче a другой функции?

Я понимаю, что могут быть другие проблемы со второй формой, которые мешают компиляции, например, вы не можете иметь (неконстантную) ссылку на временную. Так что, да, мне любопытно узнать все различия, но сначала я хочу подтвердить, что они полностью эквивалентны для остальной части объема.

Обновление: в качестве примера этой «временной» проблемы, которую @KerrekSB повторил, иногда вы должны сделать простую ссылку const. В таком случае, мой вопрос, есть ли разница между:

const A && a = .....

и

const A &  a = .....

Ответы [ 4 ]

1 голос
/ 25 декабря 2011

(Отвечая на мой собственный вопрос только для того, чтобы подвести итог тому, что, я думаю, я выучил.)

В целом, в чем разница между A &a = ... и A &&a = ...?И между const A &a = ... и const A &&a = ...?Если они являются именами параметров функции, то это явно влияет на поиск функций, но я просто говорю о локальных переменных.Различия:

  1. (Очевидное) const должно быть выполнено.Ссылка const не может быть использована для изменения объекта.
  2. A &a = foo(); не может привязаться к временному объекту (там нет ничего нового), но остальные три формы могут и продлят время жизни долокальная переменная.
  3. decltype(a) будет отличаться.
  4. (Предполагается, что не было проблем с константой), инициализация, вероятно, будет такой же, за исключением случаев, когда есть operator & или operator &&Конверсии на выбор.

Таким образом, различий меньше, чем я предполагал изначально.Несколько месяцев назад я думал, что

A &&a =...;
foo(a);

позвонит foo(A&&).Но вместо этого требуется foo(move(a)).

Программист C ++ 03 может довольно безопасно использовать A &&a = для продления срока службы временных файлов, не беспокоясь о других неожиданных различиях.

(Спасибовсем)

1 голос
/ 20 декабря 2011

Разница между A && a= ... и A & a= ... заключается в том, что первый может связываться с временным, а второй - нет.Стандарт C ++ теперь указывает, что ссылка должна быть энергонезависимой const или ссылкой rvalue для привязки к временному (см. 8.5.3 Ссылки [dcl.init.ref]), который затем может продлить время жизни временного (см.12.2 [class.teven]).

РЕДАКТИРОВАТЬ: Если вы думаете о том, что ссылки rvalue позволяют вам делать, они должны иметь возможность привязываться к временным файлам, в противном случае вы не сможете выразить семантику перемещения вC ++.

1 голос
/ 25 декабря 2011

Могут быть различия с operator A& и operator A&&, вызываемыми в одном и другом случае соответственно (вам нужно проверить спецификацию и DRs , которые изменили / исправили эту часть спецификации ).

Что определенно отличается decltype(a) для обоих случаев.

1 голос
/ 20 декабря 2011

Это работает:

int foo();

int && a = foo();

Это не:

int & b = foo(); // error, cannot bind rvalue to non-const ref
...