Использование ссылочных членов rvalue? - PullRequest
38 голосов
/ 23 января 2011

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

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

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

Ответы [ 4 ]

23 голосов
/ 23 января 2011

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

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

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

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

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

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

http://www.open -std.org / ОТК1 / SC22 / wg21 / Docs / ПРГ-active.html # 1385

11 голосов
/ 23 января 2011

По словам Стефана Т. Лававея , члены ссылочных данных rvalue бесполезны.

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

2 голосов
/ 23 января 2011
class A {
  // ...
  // Is this one useful?
  Foo &&f; 
};

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

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

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

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

2 голосов
/ 23 января 2011

Просто подумайте вслух, но разве это не будет полезно в функторах? Конструктор часто используется для «карри», связывая некоторые параметры заранее, перед фактическим вызовом функции.

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

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

...