考虑以下代码:

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(); }

我应该使用哪个版本的foofoo1是我在野外看到的最多的东西,但我担心它会引入我不想要的拷贝。我有一个自定义仿函数,要复制很繁重,所以我想避免这种情况。目前,我倾向于使用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/

10-11 23:06
查看更多