不,你不能那样做。然而,问题不在于std::initializer_list
不够稳定。它不起作用,因为您不能output<>()
在循环的每次迭代中更改类型。
初始化列表可以是constexpr
,并且constexpr
值可以用作非类型模板参数。例如,这些都有效:
constexpr std::initializer_list<int> x{10, 20};
output<x.size()>();
output<*x.begin()>();
constexpr const int& ref = *x.begin();
output<ref>();
在您的代码中,v
不是constexpr
. 它在循环的每次迭代中都会发生变化。所以不能用作非类型模板参数。
总而言之,std::initialier_list<>
一个这样的列表的大小和列表的特定元素都足够恒定,可以作为非类型模板参数。对列表中元素的引用(在循环的每次迭代中都会发生变化)不够恒定。
您会发现在循环的每次迭代中发生的任何变化都不是足够恒定的。以同样的方式,auto
用于在迭代之间更改类型的循环中的变量也是不可能的。
整数常量表达式和类型只能在模板化对象或函数的实例化之间改变。在模板的每个实例化上,它们都有一个固定的值,用于被实例化的对象/函数的整个范围。它们不能在循环的迭代之间改变。