【问题标题】:Parameter pack form of 'auto ... arg' is enabled in lambda but not in function?在 lambda 中启用了“auto ... arg”的参数包形式但在函数中未启用?
【发布时间】:2015-03-07 14:51:37
【问题描述】:

谁能解释一下为什么在这种情况下(在 lambda 中使用时)参数可以声明为“auto ... arg”:

    auto glambda = [](auto a, auto&& b) { return a < b; }; 
    bool b = glambda(3, 3.14); // OK

    auto vglambda = [](auto printer) { 
        return [=](auto ... ts) { // OK: ts is a function parameter pack 
            printer(std::forward<decltype(ts)>(ts)...);
            return [=]() { printer(ts ...); };
        };
    };

    auto p = vglambda( [](auto v1, auto v2, auto v3) { std::cout << v1 << v2 << v3; } ); 

    auto q = p(1, 'a', 3.14); // OK: outputs 1a3.14 q(); // OK: outputs 1a3.14

生活example.

但不在 this 中(在函数中使用时):

void func(auto ... arg)
{
}

生活example.

我会很高兴引用最新的 ISO C++ 草案的详细解释。还是这是clang编译器的错误?因为它实际上在 gcc 5.0 下编译得很好。

【问题讨论】:

  • 最新的最好。但我也想要一些文档参考。
  • 嗯,至少在 C++14 之前它是无效的。不过,Concepts TS 可能会以某种形式进入 C++1z,但会允许它:en.cppreference.com/w/cpp/language/function
  • 似乎还没有出现在 C++1z 的最新草案中。
  • 什么?你能更详细地解释一下你在说什么吗?
  • 嗯,在函数参数(不是 lambda 参数)中使用占位符类型在概念 TS 中,但这甚至不是当前 C++1z 草案的一部分。然而。所以根本不允许。

标签: c++ gcc parameters lambda clang


【解决方案1】:

我自己找到了答案。它在第 5.1.2.5 节的“n4296”中说明:

非泛型 lambda 表达式的闭包类型有一个公共的 内联函数调用运算符(13.5.4),其参数和返回 类型由 lambda 表达式描述 parameter-declaration-clause 和 trailing-return-type 分别。 对于泛型 lambda,闭包类型具有公共内联函数 呼叫操作员成员模板 (14.5.2) 其模板参数列表 由一个发明的类型模板参数组成,每次出现 auto 在 lambda 的参数声明子句中,按顺序 外观发明的模板参数类型是一个参数包 如果相应的参数声明声明了一个函数 参数包(8.3.5)。的返回类型和函数参数 函数调用运算符模板是从 lambda 表达式的尾随返回类型和 parameter-declarationclause 通过替换每次出现的 auto in 带有名称的参数声明子句的声明说明符 相应发明的模板参数。

这意味着这样的事情:

[](auto ... arg) {}

大致相当于:

template<class ... tmp>
ClosureType::operator()(tmp ... arg);

但是我不知道为什么在正常功能中也不允许这样做。也许应该有人提议。

【讨论】:

    猜你喜欢
    • 2011-12-04
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2020-01-31
    • 2019-05-05
    相关资源
    最近更新 更多