在浏览有关列表初始化的各种规则时,我在dcl.init.list#3.6中找到了这个:
否则,如果 T 是
std::initializer_list<E>
的特化,则对象构造如下所述。
另一方面,在std::initializer_list
的概要中,在 support.initlist 中,我发现了以下语句:
如果声明了
initializer_list
的显式专业化或部分专业化,则程序格式不正确。
这些陈述似乎是矛盾的,那么我误解了什么?
模板专业化"有两个不同的含义:
">显式(完全(专用化"或"部分专用化" - 一种语言结构,用于更改模板参数的某种组合的模板含义。
通过将模板参数替换到模板中从模板生成的东西。
换句话说,如果为模板指定模板参数,则生成的类型/函数/变量/...是该模板的专用化。例如std::vector<int>
是std::vector
的专业化。
看起来你引用的第一段话使用了(2(。
因此,"如果T
是std::initializer_list<E>
的专业化">大致意思是"如果存在这样的E
,std::is_same_v<T, std::initializer_list<E>>
",或者"如果T
是std::initializer_list<E>
"。
没有矛盾。
如果声明了initializer_list的显式专业化或部分专业化,则程序格式不正确。
表示您不能声明专业化。 编译器本身被允许消除std::initializer_list
的特殊性
可能导致您出现问题的是,您从模板中获得的具体类型称为专用化。 这就是第一段所说的。 第二段是关于实际定义/声明std::initializer_list
专业化