gpt4 book ai didi

c++ - 我什么时候应该 std::forward 一个函数调用?

转载 作者:可可西里 更新时间:2023-11-01 16:35:27 26 4
gpt4 key购买 nike

我在 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 的一个很好的用例如果我们想让计时器类型成为编译时间常量。

最佳答案

更好地描述什么 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

关于c++ - 我什么时候应该 std::forward 一个函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31253334/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com