所以我偶然发现了这段代码,我不明白为什么下面的结构不是格式错误的。
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 为零时,扩展的实例化产生一个空列表。这样的实例化不会改变封闭构造的句法解释,即使在完全省略列表的情况下,否则会格式错误或会导致语法中的歧义。[?例子:
Run Code Online (Sandbox Code Playgroud)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
?—?结束示例?]
所以它不是std::index_sequence<, 0>
,而是std::index_sequence<0>
。