我最近在工作草案,编程语言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表达式才有可能。
我希望澄清和/或阐明。
答案 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。