std::initializer_list可以特化吗?

Can std::initializer_list be specialized?

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

Otherwise, if T is a specialization of std​::​initializer_­list<E>, the object is constructed as described below.

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

If an explicit specialization or partial specialization of initializer_­list is declared, the program is ill-formed.

这些看起来是相互矛盾的说法,所以我误解了什么?

没有矛盾。

If an explicit specialization or partial specialization of initializer_­list is declared, the program is ill-formed.

表示您不能申报专业化。允许编译器本身消除 std​::​initializer_­list

的特化

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

的专业化

"A template specialization" 有两个不同的含义:

  1. "Explicit (full) specialization" 或 "partial specialization" - 一种语言结构,可根据模板参数的某些组合更改模板的含义。

  2. 通过将模板参数替换到模板中而从模板生成的内容。
    换句话说,如果您为模板指定模板参数,则生成的 type/function/variable/... 是该模板的 specialization。例如。 std::vector<int>std::vector 专业化

您引用的第一段似乎使用了 (2)。

所以"if T is a specialization of std​::​initializer_­list<E>"大致就是"if there exists such E that std::is_same_v<T, std::initializer_list<E>>",或者"if T is a std::initializer_list<E>".