是否(或将会)在 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 AbrahamsN3418。 其中第 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.12.2 为 NAD(不是缺陷),并且不会重新打开它们。 N3560 是从 N3418 中分离出来的,这是主要的提案,而 2.1N3560 中的提案是:

允许在 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.8clang-3.6 都失败了。因此,我认为这是一个实施问题。但是,我对 C++14 标准不够熟悉,不知道为什么/是否被接受(例如,支持它的 g++ 4.9 可能是非标准的)。

【讨论】:

以上是关于是否(或将会)在 lambda 表达式中使用熟悉的模板语法?的主要内容,如果未能解决你的问题,请参考以下文章

lambda表达式和闭包

为啥要使用lambda表达式?原来如此,涨知识了

高级技巧之Lambda表达式

java8新增特性---Lambda表达式

C# 多线程传递多个参数

是否可以缓存在 lambda 表达式中评估的值?