C++11 如何转发右值引用?

C++11 如何转发右值引用?,c++11,rvalue-reference,C++11,Rvalue Reference,如果我有一个std::vector包装器,我是否将其转发到我的底层vector,如下所示: void vector_wrapper::emplace_back(value_type&& val) { wrapped_vector_.emplace_back(std::move(val)); } 或 ?如果值\u type是推导的模板参数,则使用std::forward(val)(从标题);这是完美转发配方的一部分。如果不是,并且value\u type是一种特定类型(包

如果我有一个std::vector包装器,我是否将其转发到我的底层vector,如下所示:

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


如果
值\u type
是推导的模板参数,则使用
std::forward(val)
(从
标题);这是完美转发配方的一部分。如果不是,并且
value\u type
是一种特定类型(包括非推断模板参数),请使用
std::move(val)
(也可从
中选择)。如果你很快采纳了的建议,并让
emplace_back()
接受可变数量的参数,这(很可能)意味着使用可变模板和完美的转发,这意味着
转发
将是合适的构造

示例:

完美转发:

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

(从技术上讲,您可以对这两种情况都使用
std::forward()
,因为对于非左值引用类型,它相当于
std::move()
,因此是编写
std::move()
的一种更为奇特的方式。但是说
std::move()更为简洁。)
当不需要向前的类型内省时,更重要的是,它可以更好地传达代码的意图。)

命名的右值引用是左值,因此使用
std::move
。这个问题可能会有帮助。另外,我建议您将
放置_back
更改为接受可变数量的参数(如
向量
),因为元素可能由多个参数构成。Xeo:您能回答这个问题吗,这样我就可以标记它了?
template<typename... P>
void vector_wrapper::emplace_back( P &&...p ) {
    wrapped_vector_.emplace_back( std::forward<P>(p)... );
}
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()