何时应该转发函数调用

When should I std::forward a function call?

本文关键字:函数调用 转发 何时应      更新时间:2023-10-16

我在Effective Modern c++ 中看到的代码片段巧妙地实现了创建函数定时器:

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)(...

    根据我的理解,我们实际上是函数转换为其原始类型,但是为什么需要这样做?看起来一个简单的调用就可以完成这个任务。
  • 是否有其他情况下,我们使用完美转发进行函数调用?

这看起来是在lambda表达式中使用熟悉的模板语法的一个很好的用例,如果我们想让计时器类型成为编译时间常数的话。

std::forward<decltype(func)>(func)(...)所做的更好的描述是保留传递给lambda的参数的值类别。

考虑以下具有refqualified operator()重载的函子。

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

请记住,在lambda func的主体中是一个左值(因为它有一个名称)。如果没有forward函数参数,则永远无法调用&&限定的重载。此外,如果没有&限定的重载,那么即使调用者传递给您一个右值foo实例,您的代码也将无法编译。

现场演示