我想知道右值引用成员有什么用
class A {
// ...
// Is this one useful?
Foo &&f;
};
与左值引用成员相比,它有什么优点或缺点吗?它的主要用例是什么?
我想知道右值引用成员有什么用
class A {
// ...
// Is this one useful?
Foo &&f;
};
与左值引用成员相比,它有什么优点或缺点吗?它的主要用例是什么?
我已经看到了一个非常鼓舞人心的右值引用数据成员用例,它在 C++0x 草案中:
template<class... Types>
tuple<Types&&...>
forward_as_tuple(Types&&... t) noexcept;
效果:构造对 t 中参数的引用元组,适合作为参数转发给函数。因为结果可能包含对临时变量的引用,所以程序应确保此函数的返回值不会超过它的任何参数。(例如,程序通常不应将结果存储在命名变量中)。
回报:
tuple<Types&&...>(std::forward<Types>(t)...)
当右值用作 forward_as_tuple 的参数时,元组具有右值引用数据成员,否则具有左值引用数据成员。
我发现 forward_as_tuple 随后在需要捕获可变参数时很有帮助,将它们完美地打包为一个元组,然后在转发到函子时重新展开它们。在实现 LWG 1385 中提出的 tuple_cat 的增强版本时,我以这种方式使用了 forward_as_tuple:
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1385
根据Stephan T. Lavavej的说法,右值引用数据成员没有用。
[at 31:00]我看到程序员在获得右值引用时会做的事情是,他们开始有点疯狂,因为他们是如此强大。他们开始说“哦,我将拥有右值引用数据成员,我将拥有右值引用局部变量,我将拥有右值引用返回值!” 然后他们编写这样的代码:[...]
class A {
// ...
// Is this one useful?
Foo &&f;
};
In this specific case, there is no reason to use an rvalue reference. It doesn't buy you anything you couldn't have done before.
But you may want to define data members with parameterized types. std::tuple is going to support lvalue and rvalue reference data members, for example. This way it allows you to codify an expression's value category which might come in handy for "delayed perfect forwarding". The standard draft even includes a function template of the form
template<class Args...>
tuple<Args&&...> pack_arguments(Args&&...args);
But I'm honestly not sure about its usefulness.
只是在这里大声思考,但它在函子中没有用吗?构造函数通常用于“currying”,在实际函数调用之前预先绑定一些参数。
因此,在这种情况下,类成员只是即将到来的函数调用的暂存地(或手动实现的闭包),我看不出为什么右值引用在那里没有意义。
但是在“常规”非函子类中,我认为没有什么意义。