命名空间 std 专业化的限制
简介
std 命名空间在 C 中至关重要,容纳基本库和模板。但是,用户可能想知道此命名空间中允许和禁止的自定义之间的界限在哪里。本文将阐明 std 中无法特化的模板。
禁止的模板
根据 C 标准,std 中的某些模板无法显式特化。其中包括:
-
numeric_limits:禁止非算术标准类型(例如复杂
)-
shared_ptr
:需要CopyConstructibility、CopyAssignability 和 LessThanComparability-
weak_ptr
:需要 CopyConstructibility 和 CopyAssignability-
std::hash
:专业化必须满足哈希类模板要求-
:为本子条款中的任何类模板添加专业化的未定义行为(有限的 common_type 专业化除外)-
Locales
:某些存在所需的专业化-
istreambuf_iterator
:需要简单的复制构造函数、constexpr 默认构造函数和简单的析构函数-
complex
:使用其他类型实例化时未定义的效果比 float、double 或 long double-
atomic
:需要删除的复制构造函数、删除的复制赋值运算符和 constexpr 值构造函数-
unary_function 和binary_function
:已弃用;不能特化
一般限制
除了禁止的模板之外,C 标准还强调以下限制:
- 它是除非明确指定,否则在 std 或其子命名空间中声明或定义任何内容的未定义行为。
- 仅当专业化依赖于用户定义的类型并满足原始模板的标准要求时,才可以将其添加到 std。
- 禁止显式特化 std 库类的成员函数、成员函数模板或成员类模板。
- 仅当依赖于用户定义的类型名称并符合标准时才允许显式实例化对原始模板的要求。
以上是`std` 命名空间中的哪些模板不能在 C 中专门化?的详细内容。更多信息请关注PHP中文网其他相关文章!