Programing

std 네임 스페이스를 전문화 할 수있는 것과 할 수없는 것은 무엇입니까?

crosscheck 2020. 12. 31. 22:50
반응형

std 네임 스페이스를 전문화 할 수있는 것과 할 수없는 것은 무엇입니까?


사용자는 std네임 스페이스에 명시 적 전문화를 추가 할 수 있습니다 . 그러나 명시 적으로 전문화가 금지 된 몇 가지 템플릿이 있습니다.

전문화 할 수있는 템플릿과 할 수없는 템플릿은 무엇입니까?


표준에서 느슨하게 인용 :

  • numeric_limits비 산술 표준 유형 (예 : 전문 수 없다 complex<T>)

  • "[S] pecializations는 shared_ptrCopyConstructible, CopyAssignable 및 LessThanComparable [및]으로 변환 가능해야 bool합니다."

  • "의 전문화는 weak_ptrCopyConstructible 및 CopyAssignable이어야합니다."

  • "[T] emplate 전문화 [of std::hash]는 클래스 템플릿 해시의 요구 사항을 충족해야합니다."

  • Anything in <type_traits>: "이 하위 절에 정의 된 클래스 템플릿에 대한 전문화를 추가하는 프로그램의 동작은 달리 지정되지 않는 한 정의되지 않습니다." (의 일부 전문화 만 common_type명시 적으로 허용됨)

  • 로케일에는 특정 필수 전문화가 있습니다.

  • 의 모든 전문화 istreambuf_iterator에는 간단한 복사 생성자, constexpr 기본 생성자 및 간단한 소멸자가 있어야합니다.

  • " complexfloat, double 또는 long double 이외의 유형에 대한 클래스 템플릿 인스턴스화의 효과 는 지정되지 않았습니다." 나는 그러한 다른 전문화를 정의하는 것이 무의미하다는 것을 의미합니다.

  • " atomic템플릿 의 전문화 및 인스턴스화 에는 삭제 된 복사 생성자, 삭제 된 복사 할당 연산자 및 constexpr 값 생성자가 있어야합니다."

  • "클래스 템플릿 unary_functionbinary_function되지 않습니다. 프로그램은 이러한 템플릿의 전문화를 선언 할 수 없다."

물론 가장 중요한 조항 17.6.4.2.1, 문장 1 (@sehe 및 @curiousguy에게 감사드립니다) :

C ++ 프로그램의 동작은 별도로 지정하지 않는 한 네임 스페이스 std 또는 네임 스페이스 std 내의 네임 스페이스에 선언 또는 정의를 추가하는 경우 정의되지 않습니다. 프로그램은 선언이 사용자 정의 유형에 의존하고 특수화가 원본 템플릿에 대한 표준 라이브러리 요구 사항을 충족하고 명시 적으로 금지되지 않은 경우에만 표준 라이브러리 템플릿에 대한 템플릿 전문화를 네임 스페이스 std에 추가 할 수 있습니다.

그리고 문장 2 :

C ++ 프로그램의 동작은 다음과 같이 선언하면 정의되지 않습니다.

  • 표준 라이브러리 클래스 템플릿의 멤버 함수에 대한 명시 적 전문화 또는

  • 표준 라이브러리 클래스 또는 클래스 템플릿의 멤버 함수 템플릿에 대한 명시 적 전문화 또는

  • 표준 라이브러리 클래스 또는 클래스 템플릿의 멤버 클래스 템플릿에 대한 명시 적 또는 부분적 전문화.

프로그램은 선언이 사용자 정의 형식의 이름에 의존하고 인스턴스화가 원본 템플릿에 대한 표준 라이브러리 요구 사항을 충족하는 경우에만 표준 라이브러리에 정의 된 템플릿을 명시 적으로 인스턴스화 할 수 있습니다.

참조 URL : https://stackoverflow.com/questions/8513417/what-can-and-cant-i-specialize-in-the-std-namespace

반응형