如果我有一个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);
}发布于 2013-06-19 22:52:31
如果value_type是一个推导出的模板参数,则使用std::forward<value_type>(val) (来自<utility>头);这是完美转发方法的一部分。如果不是,并且value_type是特定类型(包括非推导的模板参数),请使用std::move(val) (也来自<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()的一种更时髦的方式。但是,当不需要forward<>的类型自省时,使用std::move()更简洁,而且更重要的是,它更好地传达了代码的意图。)
https://stackoverflow.com/questions/17187451
复制相似问题