如何转发右值参考?

时间:2013-06-19 09:17:24

标签: c++11 rvalue-reference

如果我有一个std :: vector-wrapper,我可以将它转发到我的底层矢量:

void vector_wrapper::emplace_back(value_type&& val) { 
  wrapped_vector_.emplace_back(std::move(val)); 
}

void vector_wrapper::emplace_back(value_type&& val) {
  wrapped_vector_.emplace_back(val); 
}

1 个答案:

答案 0 :(得分:3)

如果value_type是推断的模板参数,请使用std::forward<value_type>(val)(来自<utility>标题);这是完美转发配方的一部分。如果不是,并且value_type是特定类型(包括非推断的模板参数),请使用std::move(val)(也来自<utility>)。如果您采用很快的建议并使emplace_back()获取可变数量的参数,那么(很可能)意味着使用可变参数模板并完美转发,这意味着forward<T>将是适当的结构。

示例:

完美转发:

template<typename... P>
void vector_wrapper::emplace_back( P &&...p ) {
    wrapped_vector_.emplace_back( std::forward<P>(p)... );
}

value_type的特定或非推断类型:

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()的更加方便的方式。但是,当不需要std::move()的类型内省时,更简洁地说forward<>,更重要的是,它更好地传达了代码的意图。)