私は疑問に思っています
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
_はT(-1) < T(0)
として定義されます(表49を参照)。ブール変換と標準算術変換のルールを使用すると、これは_T = bool
_のfalse
であることがわかります(bool(-1)
はtrue
であるため、 _1
_)。同様に、_is_unsigned<T>::value
_はT(0) < T(-1)
として定義され、_T = bool
_の場合はtrue
です。
はい、他の単項型の特性と同様に、明確に定義されています。
C++ 14(n4140)20.10.4/2「単項型の特性」の義務:
これらの各テンプレートは、対応する条件がtrueの場合、BaseCharacteristicが
true_type
、それ以外の場合はfalse_type
のUnaryTypeTrait(20.10.1)になります。
20.10.1/1:
naryTypeTraitは、型のプロパティを示します。これは、1つのテンプレート型引数と、オプションで、記述されているプロパティの定義に役立つ追加の引数を取るクラステンプレートでなければなりません。これは
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
が符号付き算術型の場合、メンバー定数値はtrueになります。その他のタイプの場合、値はfalseです。
それで、あなたが std::is_arithmetic
を見れば
Tが算術型(つまり、整数型または浮動小数点型)の場合、メンバー定数値はtrueになります。その他のタイプの場合、値はfalseです。
最終的に std::is_integral
につながります
Tが整数型かどうかをチェックします。 Tが型
bool
、char
、char16_t
の場合、trueに等しいメンバー定数値を提供します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
が符号なしと見なされることも確認できます。