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

时间:2015-07-03 15:40:37

标签: c++ language-lawyer standards-compliance c++-standard-library

例如,为了论证,我们假设找到了对整数类型向量的更有效(存储,操作)实现(与通用向量实现相比)。标准符合库可以执行以下操作:

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>,而
  • vector<anything_else, A> 在内部映射class vector<T, A>

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

标准明确指出 17.5.1.4 ad。 7

  

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