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

tem*_*boy 5 c++ lambda function-pointers c++11

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

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

Bar*_*rry 10

让我们以一个普通的lambda为例:

Object o;
auto foo = [&]{ return o; };
Run Code Online (Sandbox Code Playgroud)

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

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

    Object& o;
};
Run Code Online (Sandbox Code Playgroud)

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

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