参数类型模板类型中的通用lambda auto

时间:2017-02-25 22:47:08

标签: c++ lambda c++14 auto

我想弄清楚为什么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)。我希望他们不会删除我的解释。

谢谢!

2 个答案:

答案 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

  

在上下文中使用autodecltype(auto)的程序   在本节中明确允许的是不正确的。

答案 1 :(得分:1)

您对标准的误解与parameter-declaration-clause允许的内容有关。这是parameter-declaration的列表。这涉及很多复杂的语法。

但解开复杂语法的最终结果是auto无法使用template-argument-list。这就是您在使用vector<auto>时尝试做的事情。

所以5.1.2是无关紧要的,因为语法auto只是不能放在那里。