是否允许(或将允许)在lambda表达式中使用熟悉的模板语法

Is (or will be) the use of familiar template syntax in lambda expressions allowed?

本文关键字:熟悉 语法 lambda 是否 表达式      更新时间:2023-10-16

C++14引入了泛型lambda。在浏览相关提案时,我发现Faisal Vali、Herb Sutter和Dave AbrahamsN3418。其中第2.2节标题为:

2.2允许在lambda表达式中使用熟悉的模板语法

下面的代码示例包括类似以下的代码片段

[]<int N>(int (&a)[N]) {}

由于这些东西无法编译(使用gcc、clang和Visual Studio(,因此出现了一些问题:

  • 这是一个实施问题吗
  • 是什么阻止了这个部分被接受
  • 是哪一个提议最终将通用Lambda引入了该语言

被接受的论文版本是N3649,我们可以通过进化工作组(EWG(看到这一点。完成第16期:N3649、N3560、N3559、N3418通用(多态(Lambda表达式的建议:

EWG于2012年在波特兰进行了审查,并进行了后续文件。

2013年在布里斯托尔通过工作草案,编号为N3649。

布里斯托尔2013:不要在N3560中重新打开提案2.1和2.2,它们是被视为NAD。提案2.3和2.4包含在N3649中。

请注意,本文件将提案2.12.2称为NAD(非缺陷(,它们不会重新打开。N3560是从主要方案N3418中分离出来的,N3560中的方案2.1是:

允许在lambda表达式中使用熟悉的模板语法

该文件指出,2.1提案被认为是有争议的:

我们承认支持完整的模板参数列表功能一直被认为是有争议的(波特兰2012年的民意调查结果是:7 SF,5 F,3 N,1 A,1 SA 1(由少数委员会成员提出,以及因此,在本小节的结尾引用一些委员会的话在EWG讨论波特兰的这一特色。

我们可以看到N3649不包含这个提议——我从论文N3560:中的报价中猜测

"我认为我们需要的不仅仅是汽车我不知道还有多少,但我认为只有汽车太有限了".

auto最终被认为是足够的,这与说该提案是NAD是一致的,这意味着它试图解决的问题实际上不是一个问题。

注意:我会对此发表评论,但没有的声誉

如果我编译以下内容,你引用的精确结构可以很好地工作:

auto foo = []<int N>(int (&a)[N]) {};

带有:

g++-4.9 -c foo.cpp -std=c++1y

但是,使用g++-4.8clang-3.6都会失败。因此,我认为这是一个执行问题。然而,我对C++14标准不够熟悉,不知道为什么/是否接受它(例如,支持它的g++4.9可能是非标准的(。