std::is_signed<T>
및 std::numeric_limits<T>::is_signed
은 T
의 서명 여부에 대한 답변을 제공합니다.
왜 지금은 있습니까 2 개의 부호가 있는지 (즉, C++ 11 이후)?std :: is_signed의 차이점 <T> 및 std :: numeric_limits <T> :: is_signed가 있습니까?
답변
나는 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
를 반환합니다.
' std :: numeric_limits
@DavidHammen : 아니요, 제한이 있지만 전문화에는 적용되지 않습니다. 'std'에있는 기존 템플릿을 전문화 할 수 있습니다. 단지 자신의 물건을 추가 할 수 없습니다. –
@DavidHammen : 클래스 템플릿이나 오버로드 함수/함수 템플릿을 부분적으로 특수화하지 않고 네임 스페이스'std'에서 템플릿을 완전히 전문화하는 것은 항상 합법적입니다. – ildjarn
'std :: is_signed'은 타입이고'std :: numeric_limits :: is_signed' 멤버는 값입니다. 메타 프로그래밍에서 전자 프로그래밍을 사용하는 것이 훨씬 편리하며 일관성도 있습니다. –
Xeo
실제로'std :: is_signed :: value'을 실제로 사용합니다. 'std :: is_signed '를 직접 사용 하시겠습니까? –
그러나 그 결과가 다른가? – smilingthax