函数参数包

Function parameter pack

我最近在工作草案,编程语言 C++ 标准(日期为 2016-05-30,第 96 页)中看到以下代码摘录。

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

我无法理解这里的省略号。它们不是 'C' 意义上的旧椭圆,因为它们正在扩展。它们不是 "template parameter pack" 意义上的参数包,因为看不到模板。在评论中,它将这些称为函数参数包。

我研究了看是否可以定义带有参数包的常规函数​​。

void f(auto&& ...ts) {} // error

未编译但

auto k = [](auto&& ...ts){};

编译正常,我可以按预期调用它

k(1, 2, 3);

在我看来,这只是伪装的模板参数包,因为 lambda 是伪装的函子。因此,只有 lambda 表达式才有可能。

我希望得到澄清 and/or 说明。

auto 在 C++14 中添加的 lambda。

这允许您使用 template operator() 创建 lambda。

你用

[](auto x){}
[](auto...xs){}
[](auto& xs){}
[](auto&...xs){}
[](auto&& xs){}
[](auto&&...xs){}
[](auto const& xs){}
[](auto const&...xs){}

语法。请注意,可以添加 non-template 个参数(以上并不详尽)。这些对应于 auto 被映射到隐式模板类型参数。

在概念提议中有一些关于将其扩展为普通函数的讨论,这在 C++14、C++17 中被推迟,现在在 C++20 中可能是一个 TS。