std 命名空間中的專業化:限制和允許
儘管能夠為std 命名空間添加明確專業化,但某些模板有明確的禁止。了解這些限制對於確保使用 std 命名空間特化的程式碼的有效性至關重要。
特化禁止的模板
- numeric_limits: 不允許非算術標準類型(例如, complex).
- shared_ptr: 必須是CopyConstructible、CopyAssignable、LessThanComparable,並且可轉換為 bool。
- weak_ptr:
- 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 或其子命名空間新增聲明或定義時,行為未定義。例外僅適用於依賴使用者定義類型並滿足標準要求的範本特化。
禁止明確特化標準庫類別範本、成員函式範本或成員類別範本的任何成員函式。
允許專業化的範本
未明確禁止的範本如果依賴於使用者定義則可以專業化類型並滿足原始範本的標準要求。