gpt4 book ai didi

c++ - 函数参数包

转载 作者:行者123 更新时间:2023-11-30 02:26:54 24 4
gpt4 key购买 nike

我最近在工作草案,编程语言 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 表达式才有可能。

我希望得到澄清和/或说明。

最佳答案

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){}

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

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

关于c++ - 函数参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42284913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com