如果我有一个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);
}
答案 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<>
,更重要的是,它更好地传达了代码的意图。)