如果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<>更重要的是,它更好地传达了代码的意图。)