功能参数包

时间:2017-02-16 21:23:23

标签: c++ c++11 lambda auto variadic-functions

我最近在工作草案,编程语言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'意义上的旧椭圆,因为它们正在被扩展。它们不是“模板参数包”意义上的参数包,因为没有可见的模板。在注释中,它将这些引用为函数参数包。

我调查了一下我是否可以使用参数包定义常规函数。

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

没有编译但是

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

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

k(1, 2, 3);

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

我希望澄清和/或阐明。

1 个答案:

答案 0 :(得分:3)

auto lambdas在C ++ 14中添加。

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

使用

执行此操作
[](auto x){}
[](auto...xs){}
[](auto& xs){}
[](auto&...xs){}
[](auto&& xs){}
[](auto&&...xs){}
[](auto const& xs){}
[](auto const&...xs){}

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

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