为什么在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概念有了足够的把握,但我还是不能理解这一点。我错过了什么?
答案 0 :(得分:14)
完美转发仅在函数本身(在本例中为operator()
)被模板化并推导出模板参数时才有效。对于std::function
,您可以从类本身的模板参数中获取operator()
参数类型,这意味着它们永远不会从任何参数中推断出来。
完美转发背后的全部技巧是模板参数演绎部分,与参考折叠一起,是完美转发的。
我会在这里方便地链接到my other answer about std::forward
,在那里我将解释完美转发(和std::forward
)的工作原理。
请注意,std::function
的{{1}}不需要完美转发,因为用户自己决定参数应该是什么。这也是您不能将operator()
添加到&&
的原因;举个例子:
operator()