首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何转发右值引用?

如何转发右值引用?
EN

Stack Overflow用户
提问于 2013-06-19 17:17:24
回答 1查看 215关注 0票数 1

如果我有一个std:: vector -wrapper,我是否要将它转发给我的底层向量:

代码语言:javascript
复制
void vector_wrapper::emplace_back(value_type&& val) { 
  wrapped_vector_.emplace_back(std::move(val)); 
}

代码语言:javascript
复制
void vector_wrapper::emplace_back(value_type&& val) {
  wrapped_vector_.emplace_back(val); 
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-19 22:52:31

如果value_type是一个推导出的模板参数,则使用std::forward<value_type>(val) (来自<utility>头);这是完美转发方法的一部分。如果不是,并且value_type是特定类型(包括非推导的模板参数),请使用std::move(val) (也来自<utility>)。如果你接受soon的建议,让emplace_back()接受可变数量的参数,这(很可能)意味着使用可变模板和完美的转发,这意味着forward<T>将是合适的构造。

示例:

完美转发:

代码语言:javascript
复制
template<typename... P>
void vector_wrapper::emplace_back( P &&...p ) {
    wrapped_vector_.emplace_back( std::forward<P>(p)... );
}

value_type的特定类型或非推导类型

代码语言:javascript
复制
void vector_wrapper::emplace_back( value_type &&val ) {
    wrapped_vector_.emplace_back( std::move(val) );
}
    // Note: emplace_back() idiomatically uses perfect forwarding,
    // so the first example would typically be more appropriate.
    // This second form is more applicable to push_back()

(从技术上讲,您可以在这两种情况下使用std::forward<>(),因为对于非左值引用类型,它等同于std::move(),因此是编写std::move()的一种更时髦的方式。但是,当不需要forward<>的类型自省时,使用std::move()更简洁,而且更重要的是,它更好地传达了代码的意图。)

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

https://stackoverflow.com/questions/17187451

复制
相关文章

相似问题

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