函数参数包
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。
我最近在工作草案,编程语言 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。