std 命名空间中的专业化:限制和允许
尽管能够向 std 命名空间添加显式专业化,但某些模板有明确的禁止。了解这些限制对于确保使用 std 命名空间专业化的代码的有效性至关重要。
禁止专业化的模板
-
numeric_limits: 不允许非算术标准类型(例如,complex)。
-
shared_ptr: 必须可复制构造、可复制分配、LessThanComparable,并且可转换为 bool。
-
weak_ptr: 必须可复制构造且可复制分配。
-
std::hash: 特化必须满足类模板哈希的要求。
-
type_traits : 中任何类模板的显式特化除非指定,否则未定义。
-
语言环境: 需要专门化。
-
istreambuf_iterator: 需要一个简单的复制构造函数、constexpr 默认构造函数和简单的析构函数.
-
complex: 仅允许 float、double 和 long double 特化。
-
atomic: 特化必须具有已删除的复制构造函数、复制赋值运算符和 constexpr 值构造函数。
-
一元函数和二元函数: 已弃用且不应专门化。
其他限制
- 根据第 17.6.4.2.1 条,向命名空间 std 或其子命名空间添加声明或定义时,行为未定义。例外仅适用于依赖于用户定义类型并满足标准要求的模板特化。
- 禁止显式特化标准库类模板、成员函数模板或成员类模板的任何成员函数。
允许特化的模板
未明确禁止的模板如果依赖于用户定义的类型并满足原始模板的标准要求,则可以特化。
以上是std 命名空间内的专业化有哪些限制和允许?的详细内容。更多信息请关注PHP中文网其他相关文章!