std 命名空间中的专业化:限制和允许
尽管能够向 std 命名空间添加显式专业化,但某些模板有明确的禁止。了解这些限制对于确保使用 std 命名空间特化的代码的有效性至关重要。
特化禁止的模板
- numeric_limits: 不允许非算术标准类型(例如, complex).
- shared_ptr: 必须是 CopyConstructible、CopyAssignable、LessThanComparable,并且可转换为 bool。
- weak_ptr: 必须是 CopyConstructible和CopyAssignable.
- std::hash: 特化必须满足类模板 hash 的要求。
- type_traits: 内任何类模板的显式特化 除非指定,否则未定义。
- Locales: 需要
- istreambuf_iterator: 需要一个简单的复制构造函数、constexpr 默认构造函数和简单的析构函数。
- complex: 仅 float、double 和允许长双特化。
- atomic:特化必须具有已删除的复制构造函数、复制赋值运算符和 constexpr 值构造函数。
- unary_function 和 binary_function: 已弃用,不应进行专门化。
附加限制
- 每个条款17.6.4.2.1,向命名空间 std 或其子命名空间添加声明或定义时,行为未定义。例外仅适用于依赖于用户定义类型并满足标准要求的模板特化。
- 禁止显式特化标准库类模板、成员函数模板或成员类模板的任何成员函数。
允许专业化的模板
未明确禁止的模板如果依赖于用户定义则可以专业化类型并满足原始模板的标准要求。