我应该什么时候 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
实例,您的代码也将无法编译。
我在 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
实例,您的代码也将无法编译。