c – 为什么不能通过引用捕获变量的lambda可转换为函数指针?

如果我有一个lambda通过引用捕获所有自动变量([&] {}),为什么不能将它转换为函数指针?常规函数可以修改变量,就像lambda一样,可以通过引用捕获所有内容,为什么它不一样?

我想换句话说,lambda与& amp;和lambda之间的功能区别是什么?捕获列表和常规函数,使lambda不能转换为函数指针?

最佳答案
让我们以一个普通的lambda为例:

Object o;
auto foo = [&]{ return o; };

foo的类型是什么样的?它可能看起来像这样:

struct __unique_unspecified_blah
{
    operator()() const {
        return o;
    }

    Object& o;
};

你能创建一个指向该operator()的函数指针吗?不,你不能.该函数需要一些来自其对象的额外信息.这与您无法将典型的类方法转换为原始函数指针的原因相同(没有额外的第一个参数).假设你确实创建了一些这个指针 – 它怎么知道从哪里获得o?

问题的“参考”部分是不相关的 – 如果你的lambda捕获任何东西,那么它的operator()将需要在对象中引用某种存储.如果需要存储,则无法转换为原始函数指针.

转载注明原文:c – 为什么不能通过引用捕获变量的lambda可转换为函数指针? - 代码日志