std 命名空間中的明確專業化:限制和允許
雖然用戶被授予將顯式專業化附加到std 命名空間的能力,但某些模板被明確禁止進行這種做法。
禁止的專業化
依標準,以下模板無法專化:
- numeric_limits對於複雜
- shared_ptr等非算術標準類型,除非它們滿足可複製性、可分配性和可比較性的特定標準
- weak_ptr,除非它們是可複製和可分配的
- std ::hash,除非專業化遵守其模板要求
- 中定義的類模板(common_type 除外)
- 語言環境,需要特定的專業化
- istreambuf_iterator ,它必須有一個簡單的複製建構子、預設建構子和析構函式
- 複雜的除float 之外的類型, double 或long double
- 原子,除非特化遵循特定約束,例如刪除了複製構造函數和值構造函數
- unary_function 和binary_function,它們已棄用且無法特化
總體注意事項
除了這些特定的禁令之外,該標準還提供了添加到std 命名空間的一般準則:
- std 的聲明或定義除非明確指定,否則不應添加其子命名空間。
- 僅當模板專業化依賴於使用者定義的類型並滿足庫要求時才允許。
- 標準函式庫的成員函數專業化禁止類別、成員函式範本和成員類別範本。
- 僅當依賴使用者定義類型並滿足庫要求時,才允許明確範本實例化。
透過遵守針對這些限制,開發人員可以確保他們的專業化不會與 std 命名空間中標準庫的完整性和可操作性發生衝突。
以上是您可以專門化'std”命名空間中的每個模板嗎? 顯式專業化的限制和允許的詳細內容。更多資訊請關注PHP中文網其他相關文章!