调用表达式中可调用参数的完美转发的目的?

Posted

技术标签:

【中文标题】调用表达式中可调用参数的完美转发的目的?【英文标题】:Purpose of perfect forwarding for Callable argument in invocation expression? 【发布时间】:2016-08-23 13:28:01 【问题描述】:

在 Scott Meyer 的书 Effective Modern C++ on page 167(印刷版)中,他给出了以下示例:

auto timeFuncInvocation = [](auto&& func, auto&&... params) 
  // start timer;
  std::forward<decltype(func)>(func)(
    std::forward<decltype(params)>(params)...
  );
  // stop timer and record elapsed time;
;

我完全理解params 的完美转发,但我不清楚func 的完美转发何时相关。换句话说,与以下相比,上面的优点是什么:

auto timeFuncInvocation = [](auto&& func, auto&&... params) 
  // start timer;
  func(
    std::forward<decltype(params)>(params)...
  );
  // stop timer and record elapsed time;
;

【问题讨论】:

func 有一个 ref 限定的函数调用操作符。 Ohhhhhh.... 非常有道理。 【参考方案1】:

出于与参数相同的目的:所以当 Func::operator() 是 ref 限定符时:

struct Functor

    void operator ()() const &   std::cout << "lvalue functor\n"; 
    void operator ()() const &&  std::cout << "rvalue functor\n"; 
;

Demo

【讨论】:

去掉const 部分,那么它更好有意义。 不,因为const 右值引用更喜欢const &amp; 重载而不是&amp;&amp; 重载:const Functor f() return Functor; ; f()(); example

以上是关于调用表达式中可调用参数的完美转发的目的?的主要内容,如果未能解决你的问题,请参考以下文章

C/C++: C++可调用对象详解

python 装饰器总结

lambda表达式复习

使属性方法可调用

C++11常用语法-贰

Django之路由系统