C ++ 11 std :: function和完美转发

时间:2012-06-21 09:32:37

标签: c++ c++11 perfect-forwarding std-function

为什么在C ++标准中定义std :: function<> :: operator()是:

R operator()(ArgTypes...) const;

而不是

R operator()(ArgTypes&&...) const;

有人会认为要正确转发参数,我们需要&amp;&amp;转发呼叫时在函数体中使用std::forward<ArgTypes>...

我部分重新实现了std :: function来测试这个,我发现如果我使用&amp;&amp;,当我稍后再尝试时,我得到“无法将xxx'左值'绑定到'xxx&amp;&amp;'”来自g ++按值传递参数到operator()。我认为我对rvalue / forwarding概念有了足够的把握,但我还是不能理解这一点。我错过了什么?

1 个答案:

答案 0 :(得分:14)

完美转发仅在函数本身(在本例中为operator())被模板化并推导出模板参数时才有效。对于std::function,您可以从本身的模板参数中获取operator()参数类型,这意味着它们永远不会从任何参数中推断出来。

完美转发背后的全部技巧是模板参数演绎部分,与参考折叠一起,是完美转发的。

我会在这里方便地链接到my other answer about std::forward,在那里我将解释完美转发(和std::forward)的工作原理。

请注意,std::function的{​​{1}}不需要完美转发,因为用户自己决定参数应该是什么。这也是您不能将operator()添加到&&的原因;举个例子:

operator()