2021 年更新:基于具有极简语义的 C++ 语法的 lambdas 在今年被选入 C23。随着委员会准确确定该功能将从 C++ 和其他实现中引入的其他内容,更多细节将会浮出水面。
2016 年更新: 在 2016 年伦敦会议上,Apple 风格的 lambdas 再次提交给工作组,new proposal document 试图解决之前尝试的几个失败,整理术语和解释,并更详细地介绍如何使闭包和 lambda 成为“类 C”。
由于the reception was cautiously positive(7-0-9 是/否/弃权),看起来类似的东西很快就会进入语言。
简而言之,C 不包含 lambda 函数,因为尚未向 ISO C 工作组提出可接受的提议以包含 lambda 函数。
您可以在此处查看工作组讨论的一些提案的列表:http://www.open-std.org/jtc1/sc22/wg14/www/documents
我可以在该列表中找到的任何类型的 lambda 的唯一建议是 Apple 的块(如 Yu Hao 的回答所示),在文档 N1451 中。该提案在N1483 中进一步讨论,将其与 C++ lambdas 进行了比较,N1493 和N1542 是提交这些文件的会议记录。
N1451 中的提案不能被接受有几个原因,在 N1542 中给出:
- 最初委员会难以理解提案
- 它使用了与现有 C 标准相矛盾的错误引用和术语
- 它显然是模糊和不完整的
- Apple 正在尝试为该功能申请专利(不清楚这是否是标准化的障碍,但我认为是这样)
- 在 2010 年提出的具有全新语义的全新功能在 2011 年及时准备就绪的可能性恰好为零,并且会推迟 C11 的发布
- 显示的块与 C++11 lambda 不兼容
看起来他们也不相信它目前已经展示了足够的实用性。 C 标准化显然试图非常保守,并且只有一个主要的编译器实现了该功能,他们可能希望等待,看看它如何与 C++ lambda 竞争,以及是否有其他人选择它。在多个编译器提供之前,它并不是真正的“C”功能,而是“Clang”功能。
综上所述,委员会的投票显然略微倾向于支持该功能(6-5-4 是/否/弃权),但不足以达成必要的共识以将其包括在内。
据我所知,另一个大的 C++11 lambdas 尚未被任何人提议包含在 C 中。如果你不问,你就不会得到。
任何关于 C 中 lambdas 的提议都会添加一系列关于变量生命周期和位置以及复制和分配等等的新规则。对于很多人来说,这可能开始看起来非常不像 C,与价值观在程序员背后移动或在他们的生命周期中突然发生意想不到的变化——避免这种事情是当今人们选择用 C 编写的一半原因。因此,还必须有一个真正符合 C 的“哲学”的提案才能被认真对待。我确信这是可以做到的,但是到目前为止,这两个大提案都是为具有非常不同“哲学”的语言设计的,在这种语言中,这种事情的障碍较少,并且没有必要 em> 反映了 C 目前的目的和特点。