std::initializer_list可以专用吗?

问题描述 投票:0回答:1

在翻阅各种关于list-initialization的规则时,我发现在 dcl.init.list#3.6:

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

在另一方面,在 "我 "的概要中,"我 "是指 "我"。std::initializer_list,在 support.initlist我发现了以下说法。

如果一个明确的特殊化或部分特殊化的... initializer_­list 被声明,程序就会出现问题。

这些 出现 的说法是矛盾的,那么我到底理解错了什么呢?

c++ language-lawyer initializer-list
1个回答
4
投票

"一个模板特殊化 "有两种不同的含义。

  1. "显式(完全)特化 "或 "部分特化" -- 一种语言结构,它改变了模板的意义,以适应模板参数的组合。

  2. 通过将模板参数代入模板生成的东西。换句话说,如果你为模板指定了模板参数,那么生成的typefunctionvariable...就是一个 专业化 该模板的。如 std::vector<int> 是一个 专业化std::vector.

看来你引用的第一段话用的是(2)。

那么 "如果 T 是一种特殊化的 std​::​initializer_­list<E>" 大致意思是 "如果有这样 Estd::is_same_v<T, std::initializer_list<E>>",或 "如果 T a std::initializer_list<E>".


1
投票

不存在矛盾。

如果声明了initializer_list的显式特化或部分特化,程序就会出现问题。

意味着你不能声明特殊化。 编译器本身是允许盖章的。std​::​initializer_­list


可能导致你出现问题的是,你从模板中得到的具体类型被称为特殊化。 这就是第一段所讲的内容。 第二段讲的是如何实际定义和声明一个专门化的 std::initializer_list

© www.soinside.com 2019 - 2024. All rights reserved.