【发布时间】:2014-11-01 19:03:33
【问题描述】:
如果我有一个通过引用 ([&] {}) 捕获所有自动变量的 lambda,为什么不能将它转换为函数指针?普通函数可以修改变量,就像 lambda 可以通过引用捕获所有内容一样,那为什么不一样呢?
我想换句话说,带有& 捕获列表的 lambda 和一个常规函数之间的功能区别是什么,使得 lambda 不能转换为函数指针?
【问题讨论】:
-
必须将所有这些捕获变量的引用(实际上是指针)存储在某处。将“按引用捕获”视为“按值捕获地址”。
-
@IgorTandetnik:如果我们使用 GC(可能但很少见)或接受内存泄漏,这将是可解决的。
-
@Deduplicator:我想编译器可以在运行时动态生成程序集 thunk;我已经看到这样做了(如果您想知道的话,是由 Microsoft 的 ATL 完成的)。不过,这在按价值捕获时同样有效;通过引用捕获既无帮助也无害。
-
@IgorTandetnik:当然,我忽略了 OP 对引用的固定。
-
这是您对 C++ lambda 的唯一疑惑吗?我有一个更基本的问题:为什么明确禁止写下 lambda 的类型?您可以将其分配给
auto变量或将其类型作为模板参数传递,仅此而已。根本没有语法来编写接受 lambda 的非模板函数。 lambdas 的类型是唯一不能写下来的,这使得它们低于二等公民。就个人而言,如果语言功能被削弱是一种基本方式,我不会再考虑它。
标签: c++ c++11 lambda function-pointers