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中文網其他相關文章!