std :: is_unsigned 임:: 가치가 잘 정의되어 있습니까?
나는 궁금하다
std::is_unsigned<bool>::value
표준에 따라 잘 정의되어 있습니까?
typename std::make_unsigned<bool>::type
잘 정의되어 있지 않기 때문에 질문 합니다.
에 대한 서명 개념이 없습니다 bool
. [basic.fundamental] / 6부터 :
유형 값은
bool
다음 중 하나true
입니다false
. [ 주 : 더이 없습니다signed
,unsigned
,short
, 또는long
bool
유형 또는 값. — end note ] 유형의 값은bool
통합 프로모션에 참여합니다 (4.5).
반대로 부호있는 정수 유형 (2 항) 및 부호없는 정수 유형 (3 항 )에 대해 부호가 명시 적으로 호출됩니다 .
이제 is_signed
및 is_unsigned
특성입니다. 첫째, 특성은 항상 잘 정의되어 있지만 산술 유형에 대해서만 흥미 롭습니다. bool
산술 유형이며 is_signed<T>::value
으로 정의됩니다 (표 49 참조) T(-1) < T(0)
. 부울 변환 표준 산술 변환의 규칙을 사용하여, 우리는이 것을 볼 false
위해 T = bool
(때문에 bool(-1)
입니다 true
되는 변환에, 1
). 마찬가지로, is_unsigned<T>::value
로 정의되고 T(0) < T(-1)
, 이는 true
대한 T = bool
.
is_unsigned
[meta.unary.comp] / 2에서 다음과 같이 정의됩니다.
경우
is_arithmetic<T>::value
이고true
동일한 결과로서
bool_constant<T(0) < T(-1)>::value
; 그렇지 않으면,false
bool
† 는 분명히 산술 유형입니다 (정수). 이제 [conv.bool] / 1을 고려하십시오.
0 값, 널 포인터 값 또는 널 멤버 포인터 값은로 변환됩니다
false
. 다른 값은로 변환됩니다true
.
즉 bool(0) < bool(-1)
동등 false < true
하고, 후자의 값으로 추진되므로 보유 0
하고 1
각각.
따라서, is_unsigned<bool>::value
이다 true
(그리고, 반대로 is_signed
인 false
인해 사실) bool
EAN 값을 부호없는 값에 해당 0
하고 1
연산 중에. 그러나 정수가 아니라 상태를 나타 내기 때문에 bool
의 부호 를 평가하는 것은 실제로 의미가 없으며 성능이 훨씬 떨어 make_unsigned
집니다.
† :이 템플릿이
bool
처음에 적용된다는 사실
은 Requirement 절이 존재하지
bool
않고 불완전한 유형 ([res.on.functions] / (2.5))이 아니고 다른 요구 사항이 언급되지 않았기 때문에 결정됩니다. 대 [meta.rqmts]
UnaryTypeTraits .
예, 다른 단항 유형 특성과 마찬가지로 잘 정의되어 있습니다.
C ++ 14 (n4140) 20.10.4 / 2 "단항 유형 특성"요구 사항 :
이러한 각 템플릿
true_type
은 해당 조건이 참이면 BaseCharacteristic이있는 UnaryTypeTrait (20.10.1) 이고 그렇지 않으면false_type
.
20.10.1 / 1 :
UnaryTypeTrait은 유형의 속성을 설명합니다. 하나의 템플릿 유형 인수와 선택적으로 설명되는 속성을 정의하는 데 도움이되는 추가 인수를받는 클래스 템플릿이어야합니다. 이 있어야한다
DefaultConstructible
,CopyConstructible
그리고 공개적 명백하게 그것으로부터 직접 또는 간접적으로 유도 BaseCharacteristic, 템플릿의 특수화integral_constant
템플릿에 인수 (20.10.3)integral_constant
특정 속성이 기술되기위한 요구에 의해 결정된다. BaseCharacteristic의 멤버 이름은 숨겨져서는 안되며 UnaryTypeTrait에서 명확하게 사용할 수 있습니다.
이로부터 "signedness"개념이 유형에 대해 의미가 있는지 여부에 관계없이 std::is_unsigned<T>::value
모든 유형에 대해 구조 가 잘 정의되어야합니다 T
.
예, 잘 정의되어 있으며 결과는 std::is_unsigned<bool>::value == true
문서에 대한이 std::is_signed
말한다
경우
T
부호 산술 타입이 상기 부재 상수 값에 해당 동일 제공한다. 다른 유형의 경우 값은 false입니다.
그래서 당신이 보면 std::is_arithmetic
T가 산술 유형 (즉, 정수 유형 또는 부동 소수점 유형 )이면 멤버 상수 값이 true와 동일합니다. 다른 유형의 경우 값은 false입니다.
마침내 std::is_integral
T가 정수 유형인지 확인합니다. T는 타입이면, 참과 동일 부재 상수 값을 제공
bool
,char
,char16_t
,char32_t
,wchar_t
,short
,int
,long
,long long
어떤 서명 서명 및 CV - 정규화 변형을 포함하거나 구현 정의 확장 정수형. 그렇지 않으면 값은 false입니다.
흥미롭게도 다음과 같은 또 다른 기능 std::numeric_limits::is_signed
이 있습니다.
의 값
std::numeric_limits<T>::is_signed
입니다true
서명 된 모든 산술 유형T
및false
서명되지 않은 유형. 이 상수는 모든 전문화에 의미가 있습니다.
어디를 위해이 전문화 bool
로 표시됩니다 false
또한 확인한다, bool
서명되지 않은 것으로 간주됩니다.
참조 URL : https://stackoverflow.com/questions/34612344/is-stdis-unsignedboolvalue-well-defined
'Programing' 카테고리의 다른 글
요소의 텍스트 노드 숨기기 (하위 제외) (0) | 2020.12.30 |
---|---|
데이터 프레임의 인덱스에서 행 이름을 어떻게 얻습니까? (0) | 2020.12.30 |
vim을 사용하여 텍스트 상자를 편집 할 수있는 Firefox 추가 기능이 있습니까? (0) | 2020.12.30 |
.cpp 파일과 .h 파일의 차이점은 무엇입니까? (0) | 2020.12.30 |
Rails 외부의 Ruby 스크립트에서 ActiveRecord를 사용하는 방법은 무엇입니까? (0) | 2020.12.30 |