std::initializer_list可以专业化吗?



在浏览有关列表初始化的各种规则时,我在dcl.init.list#3.6中找到了这个:

否则,如果 T 是std​::​initializer_­list<E>的特化,则对象构造如下所述。

另一方面,在std::initializer_list的概要中,在 support.initlist 中,我发现了以下语句:

如果声明了initializer_­list的显式专业化或部分专业化,则程序格式不正确。

这些陈述似乎是矛盾的,那么我误解了什么?

">

模板专业化"有两个不同的含义:

">
  1. 显式(完全(专用化"或"部分专用化" - 一种语言结构,用于更改模板参数的某种组合的模板含义。

  2. 通过将模板参数替换到模板中从模板生成的东西。
    换句话说,如果为模板指定模板参数,则生成的类型/函数/变量/...是该模板的专用化。例如std::vector<int>std::vector专业化

看起来你引用的第一段话使用了(2(。

因此,"如果Tstd​::​initializer_­list<E>的专业化">大致意思是"如果存在这样的Estd::is_same_v<T, std::initializer_list<E>>",或者"如果Tstd::initializer_list<E>"。

没有矛盾。

如果声明了initializer_list的显式专业化或部分专业化,则程序格式不正确。

表示您不能声明专业化。 编译器本身被允许消除std​::​initializer_­list的特殊性


可能导致您出现问题的是,您从模板中获得的具体类型称为专用化。 这就是第一段所说的。 第二段是关于实际定义/声明std::initializer_list专业化

最新更新