考虑以下代码:
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。
答案 0 :(得分:7)
实际上,我宁愿foo3
胜过foo1
(尽管身体应该是std::forward<F>(f)();
)
foo3
将导致类型F
推导为可以完美转发由于reference collapsing而引起的自变量的类型。这很有用,因为默认情况下您不会复制任何内容,并且如果您决定要将函子转发到确实想要复制它的对象,则可以保留值类别(左值与右值)。
通常,如果您的函数要存储自己的函子副本,则第一种形式(foo1
)很好,但是第三种形式(foo3
)更好地转发(使用)论点。
我还推荐Scott Meyers关于universal references和此related Stack Overflow question的精彩文章。