在 std::index_sequence 中没有对包扩展的诊断

Kos*_*Rim 4 c++ c++17

所以我偶然发现了这段代码,我不明白为什么下面的结构不是格式错误的。

template<typename T, std::size_t... lst> 
struct mystruct : std::index_sequence<lst..., sizeof...(lst)> { 
  T i; 
};

int main() {
  mystruct<int> obj;
}
Run Code Online (Sandbox Code Playgroud)

这应该是格式错误的,因为使用 T = int 实例化 mystruct 将产生以下类(在 T 替换为 int 之后):

template<int, std::size_t... lst> 
struct mystruct : std::index_sequence<, //Empty list expansion
                                      0> { 
  int i; 
}; 
Run Code Online (Sandbox Code Playgroud)

std::index_sequence<, 0>非病态如何?以上编译没有错误。

Sto*_*ica 12

空参数包永远不会“空”,这会使构造在语法上无效。

[临时变量]

7当 N 为零时,扩展的实例化产生一个空列表。这样的实例化不会改变封闭构造的句法解释,即使在完全省略列表的情况下,否则会格式错误或会导致语法中的歧义。[?例子:

template<class... T> struct X : T... { };
template<class... T> void f(T... values) {
  X<T...> x(values...);
}

template void f<>();    // OK: X<> has no base classes
                        // x is a variable of type X<> that is value-initialized
Run Code Online (Sandbox Code Playgroud)

?—?结束示例?]

所以它不是std::index_sequence<, 0>,而是std::index_sequence<0>