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" 有两个不同的含义:
"Explicit (full) specialization" 或 "partial specialization" - 一种语言结构,可根据模板参数的某些组合更改模板的含义。
通过将模板参数替换到模板中而从模板生成的内容。
换句话说,如果您为模板指定模板参数,则生成的 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>
".
在查看列表初始化的各种规则时,我在 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" 有两个不同的含义:
"Explicit (full) specialization" 或 "partial specialization" - 一种语言结构,可根据模板参数的某些组合更改模板的含义。
通过将模板参数替换到模板中而从模板生成的内容。
换句话说,如果您为模板指定模板参数,则生成的 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>
".