1

如果我有一个 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); 
}

?

4

1 回答 1

3

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

于 2013-06-19T14:52:31.330 回答