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

尼科斯(Nikos Athanasiou)

我在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的参数的值类别

考虑以下具有ref限定operator()重载的函子

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

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

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

现场演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我什么时候应该调用glDeleteBuffers()?

我什么时候应该调用realm.close()?

我什么时候应该直接调用Promise.resolve()?

我什么时候应该调用Geometry.computeBoundingBox()等?

什么时候应该以咖喱形式编写我的函数?

什么时候应该添加“&”,什么时候不应该使用C语言调用函数?

我什么时候应该调用StateHasChanged,什么时候Blazor会自动截获某些更改?

什么时候应该调用removeStickyEvent(...)?

什么时候应该使用iter函数?

什么时候应该覆盖Equals函数?

什么时候应该使用invokeCFClientFunction()函数?

函数什么时候应该内联?

什么时候应该使用函数?

什么时候调用std :: thread析构函数?

什么时候应该在函数返回值上使用std :: move?

函数 CGLGetCurrentContext 什么时候应该返回 NULL,什么时候不应该?

我们什么时候应该在ForkJoinTask.invokeAll()之后调用join()

我们什么时候应该调用multiprocessing.Pool.join?

我什么时候应该调用compileComponents,如何才能不这样做呢?

什么时候应该在我的Yii模型中调用parent :: beforeDelete()

我什么时候应该显式调用cmd.Process.Release()?

我什么时候应该调用SerialPort.Dispose()和SerialPort.Close()?

我什么时候应该在 ZipOutputStream (SharpZipLib) 上调用 Finish

如果没有 onStop() 方法,我应该什么时候调用 stopListening() 方法?

函数什么时候被调用?我如何控制它?

什么时候应该为我的类型定义哈希码函数?

什么时候应该为我的课堂提供析构函数?

我什么时候应该在 constexpr 模板函数中使用 if constexpr 与常规 if 并置?

什么时候在函数前使用const,什么时候不应该使用