为什么或何时在调用之前将可调用函数参数转换为右值?

润滑脂

到目前为止,我已经考虑过传递和调用一个Callable作为

template <class Fct, class... Args> void f(Fct&& g, Args&&... args)
{
    g(std::forward<Args>(args)...);
}

是要走的路。现在,在本讲座(第34分钟)和std :: invoke示例实现中,我看到了上述片段的等效内容,该片段在调用可调用对象之前有条件地将其转换为右值引用,

template <class Fct, class... Args> void f(Fct&& g, Args&&... args)
{
    std::forward<Fct>(g)(std::forward<Args>(args)...);
}

我假设此修改仅影响闭包,但我仍然不明白为什么第二个版本更可取:强制转换仅影响rvalue参数,调用时不应复制任何状态,对吗?我还检查了std :: function :: operator()是否被重载,&&&通过上述片段的替代库获取提示,但事实并非如此。

在此先感谢您的提示和答案!

llllllllll

完美转发的目的是尽可能保留原始信息。

g(std::forward<Args>(args)...);将删除原始函数对象的右值/左值信息,g始终被视为左值。

这将导致可观察到的效果,例如:

struct foo {
    void operator()(int) & {
        std::cout << "& called\n";
    }

    void operator()(int) && {
        std::cout << "&& called\n";
    }
};

foo{}(1)将调用第二个operator()如果您不使用第一种方法std::forwardf(foo{}, 1)将调用第一种operator()

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

为什么实例变量在构造函数调用之前被初始化?

来自分类Dev

为什么在调用函数之前和函数内部我的go函数参数具有不同的大小?

来自分类Dev

我们如何将可调用对象转换为可运行对象

来自分类Dev

为什么此Firebase可调用函数不返回值?

来自分类Dev

为什么在调用模板函数时不考虑参数转换?

来自分类Dev

在Python中,为什么函数参数在函数调用之间保持其值

来自分类Dev

为什么在lambda表达式中的委托函数调用之间保留参数i?

来自分类Dev

requestAnimationFrame在被函数调用之前运行

来自分类Dev

addEventListener-函数在调用之前执行

来自分类Dev

C ++ 11:为什么将右值引用参数隐式转换为左值

来自分类Dev

为什么After Advice在方法调用之前获取打印

来自分类Dev

TypeScript:将参数传递给函数调用之前,检查是否已定义参数的必需属性

来自分类Dev

错误:静态断言失败:转换为右值后,std :: thread参数必须可调用

来自分类Dev

C ++此函数调用之前的(void)有什么作用?

来自分类Dev

异步函数被调用之前的行

来自分类Dev

当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?

来自分类Dev

当传递可调用对象作为参数时,为什么g ++会抱怨“之前的无效声明符”?

来自分类Dev

为什么Java创建错误以将对象强制转换为可调用对象?

来自分类Dev

为什么在装饰器被调用之前必须先声明它们,而函数却不必声明呢?

来自分类Dev

Javascript函数在调用之前就已执行

来自分类Dev

Vimscript:在函数调用之前将变量解析为值

来自分类Dev

为什么在解决服务调用之前呈现模板

来自分类Dev

如何在调用之前将参数传递给函数

来自分类Dev

为什么在调用外部函数之前调用内部函数?

来自分类Dev

为什么函数在调用之前打印前两行?

来自分类Dev

线程参数在转换为右值后必须是可调用的

来自分类Dev

std::thread 参数在转换为右值后必须是可调用的

来自分类Dev

为什么字典中的函数在调用之前执行

来自分类Dev

为什么可变默认参数会记住函数调用之间的突变?

Related 相关文章

  1. 1

    为什么实例变量在构造函数调用之前被初始化?

  2. 2

    为什么在调用函数之前和函数内部我的go函数参数具有不同的大小?

  3. 3

    我们如何将可调用对象转换为可运行对象

  4. 4

    为什么此Firebase可调用函数不返回值?

  5. 5

    为什么在调用模板函数时不考虑参数转换?

  6. 6

    在Python中,为什么函数参数在函数调用之间保持其值

  7. 7

    为什么在lambda表达式中的委托函数调用之间保留参数i?

  8. 8

    requestAnimationFrame在被函数调用之前运行

  9. 9

    addEventListener-函数在调用之前执行

  10. 10

    C ++ 11:为什么将右值引用参数隐式转换为左值

  11. 11

    为什么After Advice在方法调用之前获取打印

  12. 12

    TypeScript:将参数传递给函数调用之前,检查是否已定义参数的必需属性

  13. 13

    错误:静态断言失败:转换为右值后,std :: thread参数必须可调用

  14. 14

    C ++此函数调用之前的(void)有什么作用?

  15. 15

    异步函数被调用之前的行

  16. 16

    当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?

  17. 17

    当传递可调用对象作为参数时,为什么g ++会抱怨“之前的无效声明符”?

  18. 18

    为什么Java创建错误以将对象强制转换为可调用对象?

  19. 19

    为什么在装饰器被调用之前必须先声明它们,而函数却不必声明呢?

  20. 20

    Javascript函数在调用之前就已执行

  21. 21

    Vimscript:在函数调用之前将变量解析为值

  22. 22

    为什么在解决服务调用之前呈现模板

  23. 23

    如何在调用之前将参数传递给函数

  24. 24

    为什么在调用外部函数之前调用内部函数?

  25. 25

    为什么函数在调用之前打印前两行?

  26. 26

    线程参数在转换为右值后必须是可调用的

  27. 27

    std::thread 参数在转换为右值后必须是可调用的

  28. 28

    为什么字典中的函数在调用之前执行

  29. 29

    为什么可变默认参数会记住函数调用之间的突变?

热门标签

归档