bol*_*lov 8 c++ standards-compliance c++-standard-library language-lawyer
例如,让我们假设为了论证,找到了对于整数类型向量的更有效(存储,操作)实现(与通用向量实现相比).标准符合库可以执行以下操作:
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>> { ... };
Run Code Online (Sandbox Code Playgroud)
我认为这是非法的,因为额外的模板参数.
但是一个小的编译器魔术:(除了额外的实现工作)将允许这样的事情:
vector<integral_type, A>被内部映射到class vector_integral<T, A>而vector<anything_else, A>要内部映射到class vector<T, A>.
- 这显然与标准中明确提到的专业化无关 std::vector<bool>
- 专业化显然会具有相同的界面和可观察的行为.
- 让我们忽略concepts,因为它们还不是标准的.除非你有一些事实.
- 这是一个纯粹的学术问题(阅读个人好奇心).
只要标准库实现符合标准发布的保证,就允许有专门化。这些保证显然包括增长复杂性、接口功能以及某些类的数据内部布局。
据我所知,专业化vector<bool>已包含在标准中,因为其内部数据布局与通用vector<T>库类不同,因此需要标准特别允许。
该标准明确规定了17.5.1.4 ad。7:
库子句中指定的复杂性要求是上限,提供更好复杂性保证的实现满足要求。