C ++ 11的std ::功能和完美转发(C++11 std::function and perf

2019-07-30 01:58发布

为什么的std ::定义函数<> ::运算符()中的C ++标准是:

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

并不是

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

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

我部分地重新实现的std ::功能来测试这一点,我发现,如果我用&&,我得到“无法绑定‘XXX’左值到‘XXX &&’”,从G ++,当我尝试后按值传递参数给运营商() 。 我以为我的右值/转发的概念足够的把握,但我仍然不能神交了这一点。 我在想什么?

Answer 1:

完美转发只有当函数本身(在这种情况下工作的operator()为模板和模板参数推导。 对于std::function ,你得到的operator()本身,这意味着他们将永远不会被任何参数中推演出来的模板参数的参数类型。

背后完美转发整个诀窍是模板实参推演部分,其中,参考坍塌在一起,就是完美的转发是什么。

我就方便地链接到我的其他回答有关std::forward这里,在这里我解释一下完美转发(以及如何std::forward )的作品。

需要注意的是std::functionoperator()并不需要完美转发,因为用户自己决定的参数应该是什么。 这也是为什么你不能只是增加的原因&&operator() ; 借此例如:

void foo(int){}

int main(){
  // assume 'std::function' uses 'ArgTypes&&...' in 'operator()'
  std::function<void(int)> f(foo);
  // 'f's 'operator()' will be instantiated as
  // 'void operator()(int&&)'
  // which will only accept rvalues
  int i = 5;
  f(i); // error
  f(5); // OK, '5' is an rvalue
}


文章来源: C++11 std::function and perfect forwarding