给定一个带有捕获变量的 lambda 函数,例如
[&x] (int y) { x += y; }
当我将此 lambda 传递给类型的变量时,上下文(这里是对int x
词法上下文中任何地方定义的某个变量的引用)存储在哪里std::function<void(int)>
?
我知道像std::vector
or这样的动态大小存储std::string
,但它们都存储固定类型的值(当然,一旦知道模板参数)。但是在 lambdas 的情况下,这样的存储应该能够存储任何类型的值,这些值在编译时将 lambda 分配给 a 的客户端代码std::function
已知,但在传递函数时不知道。
我的意思是,当我们修复 的具体类型时std::function
,我们修复了函数签名,而不是捕获的变量/引用的类型。幕后必须有一些动态大小和动态类型存储。显然,这不能是例如 a std::tuple
,因为这需要在实例化时知道类型,std::function
但它们不是。所以我想知道它是如何实现的(例如在 g++ 中,但这个问题可能有一个独立于编译器的答案)。