繁体   English   中英

为什么 cpp std::function 可以保存捕获 lambda,而 function 指针不能?

[英]Why cpp std::function can hold capture-lambda, while function pointer cannot?

我有这个代码片段:

    int x = 3;
    auto fauto = [=](){ cout<<'x'; };
    function<void()> func{fauto};
    func();
    void (*rawPf)() = fauto; // fail to compile
    rawPf();

我知道只有非捕获 lambda 可以分配给 function 指针的语法。 但:

(1) 为什么 std::function 可以持有 capture-lambda?

(2) as both std::function and function pointers are callable , what's the core difference that makes std::function able to hold capture-lambda, while function pointer cannot?

关于语言设计的任何详细解释?

Why can a function pointer not hold a lambda with a capture: because a Lambda is NOT a function,it's an object!

为什么没有捕获的 lambda 可以转换为 function 指针?

Lambda 只是编译器生成的 class (具有只有编译器知道的唯一类名)的普通 object (一条数据)(具有编译器知道的唯一类名)(???)使用您提供的参数定义(如果有)为您定义。 lambda 对象的数据成员由其封闭 scope 的捕获列表和/或变量的使用定义。

在 object 上调用时,所有非静态成员函数都会得到一个名为 this 的隐式隐藏参数。 当您“调用”lambda 时也是如此。

Now,when you don't capture something,the lambda has no data (empty class) and the compiler doesn't have to generate an implicit this pointer for the call,which makes the function operator just like an ordinairy function and the compiler can将其转换为 function 指针。 因此,不是 lambda 被转换为函数指针,而是 lambda 的函数运算符被转换。

为什么 std::function 可以两者兼得:因为它是一个模板,并且通过模板和专业化,您几乎可以做任何事情。

没有理由不在std::function<>中实现它,所以它已经实现了。

function 指针无法保存捕获 lambda 的原因是后者有一个this指针,并且没有地方将其存储在 function 指针中,除非您编译新代码或从井池中分配它。 但是, std::function<>可以分配任意数量的空间,其中包括this指针。

如果您尝试实现 function 返回 lambda 的 function 指针(在调用时,规范应该调用 lambda),您可以更好地理解这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM