考虑以下代码:
template<class F>
void foo1(F f) { f(); }
template<class F>
void foo2(F const& f) { f(); }
template<class F>
void foo3(F&& f) { f(); }
我应该使用哪个版本的
foo
? foo1
是我在野外看到的最多的东西,但我担心它会引入我不想要的拷贝。我有一个自定义仿函数,要复制很繁重,所以我想避免这种情况。目前,我倾向于使用foo3
(因为foo2
不允许更改仿函数),但我不确定其中的含义。我的目标是C++ 11。
最佳答案
我实际上更喜欢foo3
而不是foo1
(尽管正文应该是std::forward<F>(f)();
)foo3
将导致将F
类型推导为可让您完美地转发由于reference collapsing而引起的参数的类型。这很有用,因为默认情况下您不会复制任何内容,并且如果您决定要将仿函数转发到确实想要复制它的对象,则可以保留值类别(左值与右值)。
通常,如果您的函数要存储自己的仿函数拷贝,则第一种形式(foo1
)很好,但是第三种形式(foo3
)更好地转发(使用)参数。
我还推荐Scott Meyers关于universal references和此related Stack Overflow question的精彩文章。
关于c++ - 使用模板支持仿函数作为参数时,应使用什么限定符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51123809/