是否允许(或将允许)在lambda表达式中使用熟悉的模板语法
Is (or will be) the use of familiar template syntax in lambda expressions allowed?
C++14引入了泛型lambda。在浏览相关提案时,我发现Faisal Vali、Herb Sutter和Dave Abrahams的N3418。其中第2.2节标题为:
2.2允许在lambda表达式中使用熟悉的模板语法
下面的代码示例包括类似以下的代码片段
[]<int N>(int (&a)[N]) {}
由于这些东西无法编译(使用gcc、clang和Visual Studio(,因此出现了一些问题:
- 这是一个实施问题吗
- 是什么阻止了这个部分被接受
- 是哪一个提议最终将通用Lambda引入了该语言
被接受的论文版本是N3649
,我们可以通过进化工作组(EWG(看到这一点。完成第16期:N3649、N3560、N3559、N3418通用(多态(Lambda表达式的建议:
EWG于2012年在波特兰进行了审查,并进行了后续文件。
2013年在布里斯托尔通过工作草案,编号为N3649。
布里斯托尔2013:不要在N3560中重新打开提案2.1和2.2,它们是被视为NAD。提案2.3和2.4包含在N3649中。
请注意,本文件将提案2.1
和2.2
称为NAD(非缺陷(,它们不会重新打开。N3560
是从主要方案N3418
中分离出来的,N3560
中的方案2.1
是:
允许在lambda表达式中使用熟悉的模板语法
该文件指出,2.1
提案被认为是有争议的:
我们承认支持完整的模板参数列表功能一直被认为是有争议的(波特兰2012年的民意调查结果是:7 SF,5 F,3 N,1 A,1 SA 1(由少数委员会成员提出,以及因此,在本小节的结尾引用一些委员会的话在EWG讨论波特兰的这一特色。
我们可以看到N3649不包含这个提议——我从论文N3560
:中的报价中猜测
"我认为我们需要的不仅仅是汽车我不知道还有多少,但我认为只有汽车太有限了".
auto最终被认为是足够的,这与说该提案是NAD
是一致的,这意味着它试图解决的问题实际上不是一个问题。
注意:我会对此发表评论,但没有的声誉
如果我编译以下内容,你引用的精确结构可以很好地工作:
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可能是非标准的(。
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 使用基类指针调用基类的值构造函数的语法是什么?
- 很好的语法来获取对向量/数组数据的大小引用?
- C++语法运算符功能?
- C++使用 rand 定义函数语法
- 什么文件可以修改 atom 的C++语法?
- 我不熟悉C 语法
- 不熟悉C++语法,而我正在尝试用C++研究数据结构
- 是否允许(或将允许)在lambda表达式中使用熟悉的模板语法