我什么时候应该std ::转发函数调用?

时间:2015-07-06 18:46:17

标签: c++ lambda c++14 perfect-forwarding forwarding-reference

我在 Effective Modern C ++ 中看到的代码片段巧妙地实现了instrumentation rationale以创建函数计时器

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

我的问题是关于std::forward<decltype(func)>(func)(...

  • 根据我的理解,我们实际上 类型的转换类型,但是为什么需要它?它看起来很简单电话会做的伎俩。
  • 还有其他情况我们使用完美转发进行函数调用吗?

如果我们想让计时器类型成为编译时常量,这看起来像是the use of familiar template syntax in lambda expressions的一个很好的用例。

1 个答案:

答案 0 :(得分:12)

更好地描述std::forward<decltype(func)>(func)(...)正在做什么将保留传递给lambda的参数的值类别

考虑以下具有ref-qualified operator()重载的仿函数。

struct foo
{
    void operator()() const &&
    { std::cout << __PRETTY_FUNCTION__ << '\n'; }

    void operator()() const &
    { std::cout << __PRETTY_FUNCTION__ << '\n'; }
};

请记住,在lambda func的主体内是左值(because it has a name)。如果您没有forward函数参数,则永远不能调用&&限定的重载。此外,如果没有&限定的重载,那么即使调用者通过了右值foo实例,您的代码也无法编译。

Live demo