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

Nik*_*iou 13 c++ lambda language-lawyer c++14

C++ 14引入了通用lambdas.在浏览相关提案时,我发现了Faisal Vali,Herb Sutter和Dave Abrahams的N3418.其中第2.2节标题为:

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

以下代码示例包括此类代码段

[]<int N>(int (&a)[N]) {}
Run Code Online (Sandbox Code Playgroud)

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

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

Sha*_*our 7

接受的论文版本是N3649,我们可以通过进入演化工作组(EWG)完成第16期:N3649,N3560,N3559,N3418通用(多态)Lambda表达式的提案来看到:

由EWG在2012年波特兰评论,审议后续文件.

2013年布里斯托尔的工作草案被接纳为N3649.

Bristol 2013:不要在N3560中重新开放提案2.1和2.2,它们被认为是NAD.提案2.3和2.4由N3649涵盖.

请注意此引用提案2.12.2NAD(非A缺陷),并且不会重新打开它们.N3560被分裂开来N3418这是主要的提案和提案2.1N3560是:

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

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

我们承认支持完整的模板参数列表功能被一些委员会成员认为是有争议的(波特兰2012年秸秆调查结果是:7 SF,5 F,3 N,1 A,1 SA 1),因此得出结论在EWG在波特兰讨论这个功能的过程中,一个委员会成员引用了一些引用的小节.

我们可以看到N3649不包含这个提议,我从纸上的引文中猜到N3560:

"我认为我们需要的不仅仅是汽车.我不确定还有多少,但我认为只是汽车会限制太多".

是否该汽车最终被认为是足够的,这与说该提案NAD意味着它试图解决的问题并不是真正的问题是一致的.


for*_*rul 6

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

如果我编译以下内容,那么你引用的精确构造工作正常:

auto foo = []<int N>(int (&a)[N]) {};
Run Code Online (Sandbox Code Playgroud)

有:

g++-4.9 -c foo.cpp -std=c++1y
Run Code Online (Sandbox Code Playgroud)

但是,使用g++-4.8clang-3.6两者都失败了.因此,我认为这是一个实施问题.但是,我对C++ 14标准不太熟悉,知道为什么/它是否被接受(例如,g ++ 4.9支持它可能是非标准的).