【问题标题】:generic lambda auto in parameter type template type参数类型模板类型中的泛型 lambda auto
【发布时间】:2017-02-25 22:47:07
【问题描述】:

我试图弄清楚为什么 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 节表明每个 auto 都被转换为模板参数,与精确定位无关 (引用:consists of one invented type template-parameter for each occurrence of auto in the lambda’s parameter-declaration-clause)。

为避免以后出现任何问题:不,我没有实际的标准,但使用较早的草案 (N3797)。我希望他们没有删除我的解释。

谢谢!

【问题讨论】:

  • auto 很好,const auto 很好,const auto&amp; 很好; const std::vector&lt;auto&gt;&amp; 不好,因为它依赖于概念而不是标准 C++。

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


【解决方案1】:

“generic lambda”在[dcl.spec.auto]/3中定义:

如果auto type-specifier 显示为 decl-specifier 之一 在 parameter-declarationdecl-specifier-seqlambda-expression,该 lambda 是一个通用 lambda

const std::vector&lt;auto&gt;&amp; x 中的 auto 不是“decl-specifiers 之一 在 decl-specifier-seq”中,因此 [](const std::vector&lt;auto&gt;&amp; x){ } 不是“通用 lambda”。相反,根据 [dcl.spec.auto]/6

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

【讨论】:

  • 你发现它的速度比我快不到 30 秒
【解决方案2】:

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

但解开复杂语法的最终结果是auto 不能在template-argument-list 中使用。这就是您在使用 vector&lt;auto&gt; 时想要做的事情。

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

【讨论】:

  • 我不相信这是语法禁止的; auto 在语法上是一个简单类型说明符,就像boolint
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多