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

When should I std::forward a function call?

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


这看起来是 的一个很好的用例,以防我们想让计时器类型成为编译时间常量。

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

考虑以下具有引用限定 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