如果value_type
是推导的模板参数,则使用std::forward<value_type>(val)
(来自<utility>
标头);这是完美转发配方的一部分。如果不是,并且value_type
是特定类型(包括非推导模板参数),请使用std::move(val)
(也 from <utility>
)。如果您接受Soon的建议并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<>
更重要的是,它更好地传达了代码的意图。)