使用右值参考成员?

时间:2011-01-23 14:50:29

标签: c++ c++11 rvalue-reference

我想知道rvalue引用成员有什么用途

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

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

4 个答案:

答案 0 :(得分:23)

我已经看到了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

答案 1 :(得分:11)

根据Stephan T. Lavavej,右值参考数据成员没有用处。

  

我看到程序员在掌握右值引用时所做的事情是,他们开始变得有点疯狂,因为它们非常强大。他们开始说“哦,我会有<强>右值参考数据成员,我会有rvalue参考局部变量,我会有rvalue参考返回值!”然后他们编写这样的代码:[...]

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:2)

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

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

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

的功能模板
template<class Args...>
tuple<Args&&...> pack_arguments(Args&&...args);

但我真的不确定它的用处。