Использование ссылочных элементов rvalue?

Мне было интересно, что использовать ссылочный элемент rvalue

class A {
  // ...
  // Is this one useful?
  Foo &&f;
};

Имеются ли какие-либо выгоды или недостатки по сравнению с ссылочным элементом lvalue? Что такое простое использование?

Ответ 1

Я видел один очень мотивирующий пример использования для ссылочных данных rvalue, и он находится в проекте С++ 0x:

template<class... Types>
tuple<Types&&...>
forward_as_tuple(Types&&... t) noexcept;

Эффекты: Создает кортеж ссылки на аргументы в t подходит для пересылки в качестве аргументов к функции. Потому что результат может содержат ссылки на временные переменных, программа должна обеспечить, чтобы возвращаемое значение этой функции не переживать ни одного из его аргументов. (например, программа должна, как правило, не сохранять результат в названии переменная).

Возвращает: tuple<Types&&...>(std::forward<Types>(t)...)

Кортеж имеет элементы ссылочных данных rvalue, когда rvalues ​​используются как аргументы forward_as_tuple, и в противном случае имеют элементы ссылочных данных lvalue.

Я нашел forward_as_tuple впоследствии полезным, когда вам нужно перехватывать вариативные аргументы, прекрасно пересылать их в виде кортежа и повторно расширять их позже в момент пересылки на функтор. Я использовал forward_as_tuple в этом стиле при реализации расширенной версии tuple_cat, предложенной в LWG 1385:

http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1385

Ответ 2

Согласно Stephan T. Lavavej, члены ссылочных данных rvalue не используют.

То, что я видел программисты, когда они получают ссылки на rvalue, это то, что они начинают немного сумасшедшим, потому что они настолько мощные. Они начинают говорить: "О, у меня будут ссылки для ссылочных данных rvalue, у меня будут ссылочные локальные переменные rvalue, у меня будут значения возврата ссылки rvalue!" И затем они пишут код следующим образом: [...]

Ответ 3

Просто вслушиваясь вслух, но разве это не полезно для функторов? Конструктор часто используется для "currying", предварительно привязывая некоторые параметры до фактического вызова функции.

Итак, в этом контексте член класса является просто промежуточным местом (или закрытым вручную закрытием) для предстоящего вызова функции, и я не вижу причин, по которым ссылка rvalue не имела бы смысла там.

Но в "регулярных" классах не-функторов я не вижу много смысла.

Ответ 4

class A {
  // ...
  // Is this one useful?
  Foo &&f; 
};

В этом конкретном случае нет смысла использовать ссылку rvalue. Он не покупает вам ничего, что вы не могли бы сделать раньше.

Но вы можете определить элементы данных с параметризованными типами. Например, std:: tuple будет поддерживать элементы ссылочных данных lvalue и rvalue. Таким образом, он позволяет кодифицировать категорию значений выражения, которая может оказаться полезной для "отложенной совершенной пересылки". Стандартный черновик даже включает шаблон функции формы

template<class Args...>
tuple<Args&&...> pack_arguments(Args&&...args);

Но я честно не уверен в его полезности.