省略号出现在模板函数的参数声明中

Ellipsis appears in a parameter declaration of a template function

这是来自 cppreference 的示例。我不明白这个模式是如何扩展的。

template<typename ...Ts, int... N> void g(Ts (&...arr)[N]) {}
int n[1];
g<const char, int>("a", n); // Ts (&...arr)[N] expands to 
                            // const char (&)[2], int(&)[1]

Note: In the pattern Ts (&...arr)[N], the ellipsis is the innermost element, not the last element as in all other pack expansions.

问题一:arr是什么?

问题2:n是一个int数组,是否匹配int...N?

问题三:怎么可以展开为const char (&)[2], int(&)[1]

鉴于

template <typename ...Ts> void f(Ts&...arr);

基本上等同于

template <typename T0, typename T1, .., typename TN>
void f(T0& arr0, T1& arr1, .., TN& arrN);

对于任何 N.

同理,

template <typename ...Ts, int... Ns> void g(Ts (&...arr)[Ns]);

相当于

template <typename T0, typename T1, .., typename TN, int N0, int N1, .. int NN>
void g(T0 (&arr0)[N0], T1 (&arr1)[N1], .., TN (&arrN)[NN]);

和类型 T (&)[N] 是对大小为 N 且元素类型为 T

的 C 数组的引用

int n[1]; 是平凡的 int [1].

类型

"a" 是类型 const char[2] ({'a', '[=22=]'}).