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