Programing

std :: is_unsigned 임

lottogame 2020. 12. 30. 07:37
반응형

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_signedis_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_signedfalse인해 사실) boolEAN 값을 부호없는 값에 해당 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서명 된 모든 산술 유형 Tfalse서명되지 않은 유형. 이 상수는 모든 전문화에 의미가 있습니다.

어디를 위해이 전문화 bool로 표시됩니다 false또한 확인한다, bool서명되지 않은 것으로 간주됩니다.

참조 URL : https://stackoverflow.com/questions/34612344/is-stdis-unsignedboolvalue-well-defined

반응형