std 네임스페이스의 전문화: 제한 사항 및 허용
std 네임스페이스에 명시적인 전문화를 추가하는 기능에도 불구하고 특정 템플릿에는 명시적인 금지 사항이 있습니다. . std 네임스페이스 특수화를 사용하는 코드의 유효성을 보장하려면 이러한 제한 사항을 이해하는 것이 중요합니다.
특수화에서 금지된 템플릿
- numeric_limits: 아님 비산술 표준 유형에 허용됩니다(예: complex).
- shared_ptr: CopyConstructible, CopyAssignable, LessThanComparable이어야 하며 bool로 변환 가능해야 합니다.
- weak_ptr: CopyConstructible이어야 합니다. 그리고 CopyAssignable.
- std::hash: 전문화는 클래스 템플릿 해시의 요구 사항을 충족해야 합니다.
- type_traits: 클래스 템플릿의 명시적 특수화 는 지정하지 않는 한 정의되지 않습니다.
- 로캘: 필수 전문화.
- istreambuf_iterator: 간단한 복사 생성자, constexpr 기본 생성자 및 간단한 소멸자가 필요합니다.
- complex: float, double 및 긴 이중 특수화가 허용됩니다.
- atomic: 특수화에는 삭제된 복사 생성자, 복사 할당 연산자 및 constexpr 값 생성자가 있어야 합니다.
- unary_function 및 bin_function: 더 이상 사용되지 않으며 특수화하면 안 됩니다.
추가 제한
- 조항당 17.6.4.2.1에서는 std 네임스페이스 또는 해당 하위 네임스페이스에 선언이나 정의를 추가할 때 동작이 정의되지 않습니다. 사용자 정의 유형에 의존하고 표준 요구 사항을 충족하는 템플릿 특수화에만 예외가 적용됩니다.
- 표준 라이브러리 클래스 템플릿, 멤버 함수 템플릿 또는 멤버 클래스 템플릿의 멤버 함수를 명시적으로 특수화하는 것은 금지되어 있습니다.
특수화가 허용되는 템플릿
명시적으로 금지되지 않은 템플릿은 사용자 정의에 따라 특수화될 수 있습니다. 유형을 입력하고 원본 템플릿의 표준 요구 사항을 충족합니다.