c++ - 右值引用的意义 - 右值引用



使用右值参考成员? (3)

只是在这里大声思考,但它不会在仿函数中使用吗? 构造函数通常用于“currying”,在实际函数调用之前预先绑定一些参数。

所以在这个上下文中,类成员只是即将进行的函数调用的暂存基础(或手动实现的闭包),我认为没有理由为什么右值引用在那里没有意义。

但在“常规”非函子课程中,我没有看到太多意义。

https://src-bin.com

我想知道一个右值引用成员有什么用

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

与左值参考成员相比,它有任何好处或缺点吗? 什么是它的主要用途?


Answer #1

我已经看到了rvalue引用数据成员的一个非常激励的用例,它在C ++ 0x草案中:

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

效果:构造一个对t中参数的引用元组,适合作为参数转发给函数。 因为结果可能包含对临时变量的引用,所以程序应确保此函数的返回值不会超过其任何参数。 (例如,程序通常不应将结果存储在命名变量中)。

返回: tuple<Types&&...>(std::forward<Types>(t)...)

当rvalues用作forward_as_tuple的参数时,元组具有rvalue引用数据成员,否则具有左值引用数据成员。

我发现forward_as_tuple随后在需要捕获可变参数时很有用,完美地将它们打包为元组,然后在转发到仿函数时重新展开它们。 在实现LWG 1385中提出的增强版tuple_cat时,我使用了这种风格的forward_as_tuple:

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


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

在这种特定情况下,没有理由使用右值引用。 它不会给你带来任何你以前无法做到的事情。

但您可能希望使用参数化类型定义数据成员。 例如,std :: tuple将支持左值和右值引用数据成员。 通过这种方式,它允许您编写表达式的值类别,这对于“延迟完美转发”可能会派上用场。 标准草案甚至包括表单的功能模板

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

但我老实说不确定它的用处。





rvalue-reference