使用模板支持仿函数作为参数时,应使用什么限定符?

时间:2018-07-01 13:39:59

标签: c++ c++11 templates functor function-object

考虑以下代码:

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。

1 个答案:

答案 0 :(得分:7)

实际上,我宁愿foo3胜过foo1(尽管身体应该是std::forward<F>(f)();

foo3将导致类型F推导为可以完美转发由于reference collapsing而引起的自变量的类型。这很有用,因为默认情况下您不会复制任何内容,并且如果您决定要将函子转发到确实想要复制它的对象,则可以保留值类别(左值与右值)。

通常,如果您的函数要存储自己的函子副本,则第一种形式(foo1)很好,但是第三种形式(foo3)更好地转发(使用)论点。

我还推荐Scott Meyers关于universal references和此related Stack Overflow question的精彩文章。