是否(或将会)在 lambda 表达式中使用熟悉的模板语法?
Posted
技术标签:
【中文标题】是否(或将会)在 lambda 表达式中使用熟悉的模板语法?【英文标题】:Is (or will be) the use of familiar template syntax in lambda expressions allowed? 【发布时间】:2015-09-20 14:35:03 【问题描述】:C++14 引入了泛型 lambda。在浏览相关提案时,我发现了 Faisal Vali、Herb Sutter 和 Dave Abrahams 的 N3418。 其中第 2.2 节的标题为:
2.2 允许在 lambda 表达式中使用熟悉的模板语法
以下代码示例包括像这样的sn-ps
[]<int N>(int (&a)[N])
由于这些东西无法编译(使用 gcc、clang 和 Visual Studio),所以出现了一些问题:
这是一个实施问题吗? 是什么阻止了这部分被接受? 最终将泛型 lambda 引入语言的提案是什么?【问题讨论】:
另见:How does the standards committee indicate the status of a paper under consideration? 【参考方案1】:被接受的论文版本是N3649
,我们可以去Evolution Working Group(EWG)Completed Issue 16: N3649, N3560, N3559, N3418 Proposal for Generic (Polymorphic) Lambda Expressions看到这个:
由 EWG 在 2012 年波特兰审阅,继续撰写后续论文。
在 2013 年被 Bristol 接受为工作草案,作为 N3649。
布里斯托尔 2013:不要重新打开 N3560 中的提案 2.1 和 2.2,它们是 考虑NAD。 N3649 涵盖了提案 2.3 和 2.4。
请注意,此引用提案 2.1
和 2.2
为 NAD(不是缺陷),并且不会重新打开它们。 N3560
是从 N3418
中分离出来的,这是主要的提案,而 2.1
在 N3560
中的提案是:
允许在 lambda 表达式中使用熟悉的模板语法
那篇论文注意到提案2.1
被认为是有争议的:
我们承认支持完整的模板参数列表功能 被认为是有争议的(波特兰 2012 年的民意调查结果 分别是:7 SF、5 F、3 N、1 A、1 SA 1) 由几个委员会成员组成,以及 因此,以委员会的一些引述结束本小节 在 EWG 讨论 波特兰的这个功能。
我们可以看到N3649 不包含这个提议,我从论文N3560
中的引用中猜测:
" 我认为我们需要的不仅仅是 汽车。我不确定还有多少,但我认为只有 auto 限制太多 ”。
最后是否认为 auto 就足够了,这与说提案是 NAD
是一致的,这意味着它试图解决的问题并不是真正的问题。
【讨论】:
@NikosAthanasiou 哎呀,解决了这个问题。这是一个重要的链接,因为它链接到我提到的其他论文。 我想@forkrul 提到的 gcc4.9j 实现的行为是一个扩展。谢谢你的彻底,基于这个答案,我添加了语言律师标签。 @NikosAthanasiou 可能是在假设它会被接受的情况下实现的,我已经看过几次了。【参考方案2】:注意:我会对此发表评论,但没有声誉。
如果我编译以下内容,您引用的那个精确构造就可以正常工作:
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 可能是非标准的)。
【讨论】:
以上是关于是否(或将会)在 lambda 表达式中使用熟悉的模板语法?的主要内容,如果未能解决你的问题,请参考以下文章