我想知道rvalue引用成员有什么用途
class A {
// ...
// Is this one useful?
Foo &&f;
};
与左值参考成员相比,它有任何好处或缺点吗?什么是它的主要用途?
答案 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);
但我真的不确定它的用处。