C ++ 14引入了通用lambda。在浏览相关提案时,我发现了{strong> Faisal Vali,Herb Sutter和Dave Abrahams N3418。 其中第2.2节标题为:
2.2允许在lambda表达式中使用熟悉的模板语法
以下代码示例包括此类代码段
[]<int N>(int (&a)[N]) {}
由于这些东西无法编译(使用gcc,clang和Visual Studio),因此会出现一些问题:
答案 0 :(得分:7)
接受的论文版本为N3649
,我们可以通过访问Evolution工作组( EWG )Completed Issue 16: N3649, N3560, N3559, N3418 Proposal for Generic (Polymorphic) Lambda Expressions来看到这一点:
EWG在2012年波特兰评论,继续撰写后续文件。
在2013年布里斯托尔的工作草案中被接受为N3649。
布里斯托尔2013:不要在N3560中重新开启提案2.1和2.2,他们是 被认为是NAD。提案2.3和2.4由N3649涵盖。
请注意,此引用提案2.1
和2.2
为NAD(非A缺陷),并且不会重新打开它们。 N3560
与N3418
分开,这是2.1
中的主要提案和提案N3560
:
允许在lambda表达式中使用熟悉的模板语法
该文件指出提案2.1
被认为是有争议的:
我们承认支持完整的模板参数列表功能 一直被认为是有争议的(波特兰2012年秸秆调查结果 是:7 SF,5 F,3 N,1 A,1 SA 1)由一些委员会成员,和 因此,本小节的结尾部分引用了一个委员会的报价 在EWG讨论期间没有出席会议的成员 这个功能在波特兰。
我们可以从论文N3560
的引文中看出N3649不包含此提案:
” 我认为我们需要的不仅仅是 汽车。我不确定还有多少,但我认为只是自动会限制太多 “。
是 auto 最终被认为是足够的,这与说明提案是NAD
一致意味着它试图解决的问题并不是真正的问题。
答案 1 :(得分:6)
注意:我会对此发表评论但不具备声誉。
如果我编译以下内容,那么你引用的精确构造工作正常:
auto foo = []<int N>(int (&a)[N]) {};
使用:
g++-4.9 -c foo.cpp -std=c++1y
但是,使用g++-4.8
或clang-3.6
都会失败。因此,我认为这是一个实施问题。但是,我对C ++ 14标准不太熟悉,知道为什么/它是否被接受(例如,g ++ 4.9支持它可能是非标准的)。