首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否使用右值引用成员?

是否使用右值引用成员?
EN

Stack Overflow用户
提问于 2011-01-23 22:50:29
回答 4查看 6.8K关注 0票数 43

我想知道右值引用成员有什么用处。

代码语言:javascript
复制
class A {
  // ...
  // Is this one useful?
  Foo &&f;
};

与左值引用成员相比,它有什么优点或缺点吗?它的主要用例是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-24 02:51:42

我看到了一个非常鼓舞人心的右值引用数据成员用例,它在C++0x草案中:

代码语言:javascript
复制
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

票数 27
EN

Stack Overflow用户

发布于 2011-01-23 22:55:29

根据Stephan T. Lavavej的说法,右值引用数据成员没有用处。

at 31:00,我见过程序员在获得右值引用的时候,他们开始变得有点疯狂,因为他们太强大了。他们开始说,“哦,我要让右值引用数据成员,我要让右值引用局部变量,我要让右值引用返回值!”然后他们像这样写代码:...

票数 15
EN

Stack Overflow用户

发布于 2011-01-24 01:52:31

代码语言:javascript
复制
class A {
  // ...
  // Is this one useful?
  Foo &&f; 
};

在这种情况下,没有理由使用右值引用。它不会为你买到任何你以前做不到的东西。

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

代码语言:javascript
复制
template<class Args...>
tuple<Args&&...> pack_arguments(Args&&...args);

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4774420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档