折叠表达式扩展包中的最大元素数

Fold expressions maximum number of elements in expansion pack

本文关键字:元素 表达式 扩展 包中 折叠      更新时间:2023-10-16

请考虑以下程序:

#include <iostream>
#include <algorithm>
template<typename T, std::size_t N, std::size_t... I>
T sum_impl(T (&a)[N], std::index_sequence<I...>)
{
return (a[I] + ...);
}
template<typename T, std::size_t N>
T sum(T (&a)[N])
{
return sum_impl(a, std::make_index_sequence<N>{});
}
int main()
{
int a[512] = {[0 ... 511] = 1};
std::cout << "Sum =" << sum(a) << std::endl;
}

演示

在上述情况下,恕我直言,折叠表达式是展开本来是 for 循环的好方法。自然出现的问题是:

  1. 每个供应商的折叠表达式扩展包中是否有最大数量的元素,以及我们如何获取/访问此数字(例如,在 VC++2017 中,由于某种原因,最大数量为 745,否则程序无法编译)?
  2. 折叠表达式的扩展包中是否有许多元素,如果超出,性能会受到影响。也就是说,是否有经验法则,如果超过这个数字,如果我们使用 for 循环会更好?

C++规范中折叠表达式的规范开始如下:

8.1.6 折叠表达式                                                                                         [前折]

折叠表达式执行模板参数包的折叠 (17.5.3) 在二进制运算符上...

它持续了几段。其中没有任何内容设置C++编译器必须支持的折叠表达式的最小或最大大小。这在C++标准的这一部分中未指定;因此,这完全取决于个人C++实施。没有确定特定编译器限制的指定方法。您发现您的特定编译器将折叠表达式限制为 745 个值。该限制的原因显然与编译器的内部实现细节有关;如果不熟悉它们,就没有什么可说的了。其他编译器的限制可能更小或更大,或者仅受可用内存量的限制。

关于对模板参数包规范的引用,C++标准的该部分没有指定C++编译器必须支持的参数包的最小/最大大小。

编辑:有人指出,附件B列出了一些建议,但没有将它们指定为绝对要求;也没有明确指出折叠表达式的最大限制。

但是,附件B确实指出:

模板

声明中的模板参数 [1 024]。

有人可能会争辩说,如果"参数"的这种用法将参数合并到参数包中,这将间接影响折叠表达式。