std 名前空間の特殊化: 制限と許可
std 名前空間に明示的な特殊化を追加できるにもかかわらず、特定のテンプレートには明示的な禁止事項があります。 。これらの制限を理解することは、std 名前空間の特殊化を使用するコードの有効性を確保するために非常に重要です。非算術標準型 (例: complex).
shared_ptr: CopyConstructible、CopyAssignable、LessThanComparable であり、bool に変換可能である必要があります。
- weak_ptr: CopyConstructible である必要がありますそしてCopyAssignable.
- std::hash: 特殊化は、クラス テンプレート hash.
- type_traits: 内のクラス テンプレートの明示的な特殊化の要件を満たす必要があります。 は指定されない限り未定義です。
- Locales:必要な特殊化。
- istreambuf_iterator: 簡単なコピー コンストラクター、constexpr デフォルト コンストラクター、および簡単なデストラクターが必要です。
- complex: float、double、のみそして長い倍精度の特殊化はallowed.
- atomic: 特殊化には、削除されたコピー コンストラクター、コピー代入演算子、constexpr 値コンストラクターが必要です。
- unary_function および binary_function: 非推奨
- 追加制限
- 17.6.4.2.1 項に従い、名前空間 std またはそのサブ名前空間に宣言または定義を追加するときの動作は未定義です。例外は、ユーザー定義型に依存し、標準要件を満たすテンプレートの特殊化にのみ適用されます。
標準ライブラリ クラス テンプレート、メンバー関数テンプレート、またはメンバー クラス テンプレートのメンバー関数を明示的に特殊化することは禁止されています。
特殊化が許可されているテンプレート
- 明示的に禁止されていないテンプレートは、依存する場合は特殊化できますユーザー定義型で、元のテンプレートの標準要件を満たしています。