我想知道右值引用成员有什么用处。
class A {
// ...
// Is this one useful?
Foo &&f;
};与左值引用成员相比,它有什么优点或缺点吗?它的主要用例是什么?
发布于 2011-01-24 02:51:42
我看到了一个非常鼓舞人心的右值引用数据成员用例,它在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在需要捕获可变参数时很有帮助,可以完美地将它们作为元组转发,并在稍后转发给函数器时重新展开它们。在实现LWG1385中提出的tuple_cat的增强版本时,我使用了这种风格的forward_as_tuple:
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1385
发布于 2011-01-23 22:55:29
根据Stephan T. Lavavej的说法,右值引用数据成员没有用处。
at 31:00,我见过程序员在获得右值引用的时候,他们开始变得有点疯狂,因为他们太强大了。他们开始说,“哦,我要让右值引用数据成员,我要让右值引用局部变量,我要让右值引用返回值!”然后他们像这样写代码:...
发布于 2011-01-24 01:52:31
class A {
// ...
// Is this one useful?
Foo &&f;
};在这种情况下,没有理由使用右值引用。它不会为你买到任何你以前做不到的东西。
但您可能希望定义具有参数化类型的数据成员。例如,std::tuple将支持左值和右值引用数据成员。通过这种方式,它允许您对表达式的值类别进行编码,这对于“延迟完美转发”可能会派上用场。标准草案甚至包括表单的函数模板
template<class Args...>
tuple<Args&&...> pack_arguments(Args&&...args);但老实说,我不确定它的用处。
https://stackoverflow.com/questions/4774420
复制相似问题