std :: function如何存储lambda的上下文?

lee*_*mes 5 c++ lambda g++ c++11 std-function

给定具有捕获变量的lambda函数,例如

[&x] (int y) { x += y; }
Run Code Online (Sandbox Code Playgroud)

int x当我将这个lambda传递给类型的变量时,上下文(这里是对词法上下文中任何地方定义的某个变量的引用)在哪里std::function<void(int)>

我知道像std::vector或的动态大小存储std::string,但它们都存储固定类型的值(当然,模板参数一旦知道).但是在lambdas的情况下,这样的存储应该能够存储任何类型的值,在客户端代码的编译时已知,它将lambda分配给a std::function,但在传递函数时不知道.

我的意思是,当我们修复具体类型时std::function,我们修复了函数签名,但不修复捕获的变量/引用的类型.在场景后面必须有一些动态大小动态类型存储.显然,这不可能是例如std::tuple因为这需要在实例化时知道类型,std::function但它们不是.所以我想知道它是如何实现的(例如在g ++中,但可能存在与此问题无关的编译器答案).