标准库实现可以专门化标准类型吗

Can a standard library implementation specialize standard types?

本文关键字:标准 类型 专门化 实现      更新时间:2023-10-16

例如,为了论证起见,我们假设为积分类型的向量找到了一个更高效的(存储,对其进行操作(实现(与通用向量实现相比(。一个符合标准的图书馆能做一些类似的事情吗:

template <class T, class A, class Enable = void>
class vector { ... };
template <class T>
class vector<T, A, std::enable_if_t<std::is_integral<T>::value>> { ... };

我认为这将是非法的,因为额外的模板参数。

但是,编译器的一点魔力是什么呢?(除了额外的实现工作之外(是否允许这样的东西:

  • vector<integral_type, A>内部映射class vector_integral<T, A>,而
  • 内部映射class vector<T, A>vector<anything_else, A>

-这显然与标准中明确提到的专业化无关,比如std::vector<bool>

-专业化显然具有相同的界面和可观察的行为。

-让我们忽略concepts,因为它们还不是标准的。除非你有一些事实。

-这是一个纯粹的学术问题(阅读个人好奇心(。

只要标准库实现符合标准发布的保证,就允许进行专门化。这些保证显然包括增长复杂性、接口功能,以及某些类的数据内部布局。

据我所知,vector<bool>专业化包含在标准中,因为它的内部数据布局不同于通用的vector<T>库类,因此它需要得到标准的特别允许。

standtard明确表示17.5.1.4广告7

库子句中指定的复杂性要求是上限,提供更好复杂性保证的实现满足这些要求。