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

时间:2015-07-02 21:44:17

标签: c++ lambda language-lawyer c++14

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),因此会出现一些问题:

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

2 个答案:

答案 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.12.2为NAD(非A缺陷),并且不会重新打开它们。 N3560N3418分开,这是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.8clang-3.6都会失败。因此,我认为这是一个实施问题。但是,我对C ++ 14标准不太熟悉,知道为什么/它是否被接受(例如,g ++ 4.9支持它可能是非标准的)。