2013-03-09 4 views
5

std::is_signed<T>std::numeric_limits<T>::is_signedT의 서명 여부에 대한 답변을 제공합니다.
왜 지금은 있습니까 2 개의 부호가 있는지 (즉, C++ 11 이후)?std :: is_signed의 차이점 <T> 및 std :: numeric_limits <T> :: is_signed가 있습니까?

+4

'std :: is_signed '은 타입이고'std :: numeric_limits :: is_signed' 멤버는 값입니다. 메타 프로그래밍에서 전자 프로그래밍을 사용하는 것이 훨씬 편리하며 일관성도 있습니다. – Xeo

+1

실제로'std :: is_signed :: value'을 실제로 사용합니다. 'std :: is_signed '를 직접 사용 하시겠습니까? –

+0

그러나 그 결과가 다른가? – smilingthax

답변

7

나는 std::numeric_limits<T>이 사용자 정의 유형에 대해 특수화되어있는 경우에만 차이가 있다고 추측합니다. 이러한 사용자 정의 유형은 물론 is_signed에 대해 고유 한 값을 제공 할 수 있습니다. 그러나이 유형의 std::is_signed<T>::value을 묻는 것은 std::is_signed<T>이 독자적으로 전문화되지 않은 한 항상 false을 반환합니다. std::numeric_limits<> 법적으로 특화 될 수있는 동안 항상 지식이 하워드 Hinnant points out<type_traits>에 아무 것도 허용되지 않는다는 : std::is_signed<T>가 나타내는 조건이

is_arithmetic<T>::value && T(-1) < T(0) 

이 이

이 업데이트 인 것처럼

보인다 달리 명시되지 않는 한 전문화되어야하며 is_signed은 전문화 할 수없는 것으로 지정되어야합니다.

따라서, std::numeric_limits<T>::is_signed수도 (는 전문되었습니다 않은 경우) 사용자 정의 유형에 대한 대가 true하지만 std::is_signed<T>::value는 항상 사용자 정의 유형 false를 반환합니다.

+0

' std :: numeric_limits '사용자 정의 형식? C++ 03에서는 사용자가 네임 스페이스'std'에 아무 것도 추가하는 것은 불법입니다. 이 제한이 C++ 11에서 해제 되었습니까? –

+0

@DavidHammen : 아니요, 제한이 있지만 전문화에는 적용되지 않습니다. 'std'에있는 기존 템플릿을 전문화 할 수 있습니다. 단지 자신의 물건을 추가 할 수 없습니다. –

+0

@DavidHammen : 클래스 템플릿이나 오버로드 함수/함수 템플릿을 부분적으로 특수화하지 않고 네임 스페이스'std'에서 템플릿을 완전히 전문화하는 것은 항상 합법적입니다. – ildjarn

관련 문제