我想弄清楚为什么clang没有编译这段代码:
#include <vector>
#include <iostream>
int main() {
auto lambda = [](const std::vector<auto>& x){
std::cout << x.front() << x.back() << std::endl;
};
lambda(std::vector<int>(1,1));
}
根据这篇文章auto in pair,C ++ 14标准不允许这样做,但我找不到任何支持它的来源。
我对标准各自部分的理解是,应允许此功能(第5.1.2章第5条表明每个自动转换为模板参数,与精确定位无关
(引用:consists of one invented type template-parameter for each occurrence of auto in the lambda’s parameter-declaration-clause
)。
为避免以后出现任何问题:不,我没有实际标准,但使用较早的草案(N3797)。我希望他们不会删除我的解释。
谢谢!
答案 0 :(得分:2)
&#34;通用lambda&#34;在[dcl.spec.auto]/3中定义:
如果
auto
类型说明符显示为 decl-specifier 之一 在参数声明的 decl-specifier-seq 中 lambda-expression ,lambda是泛型lambda 。
auto
中的const std::vector<auto>& x
不是&#34;其中一个 decl-specifier
在 decl-specifier-seq &#34;中,因此[](const std::vector<auto>& x){ }
不是&#34;泛型lambda&#34;。相反,按[dcl.spec.auto]/6:
在上下文中使用
auto
或decltype(auto)
的程序 在本节中明确允许的是不正确的。
答案 1 :(得分:1)
您对标准的误解与parameter-declaration-clause
允许的内容有关。这是parameter-declaration
的列表。这涉及很多复杂的语法。
但解开复杂语法的最终结果是auto
无法使用template-argument-list
。这就是您在使用vector<auto>
时尝试做的事情。
所以5.1.2是无关紧要的,因为语法auto
只是不能放在那里。