web-dev-qa-db-ja.com

std :: is_unsigned <bool> :: valueは明確に定義されていますか?

私は疑問に思っています

std::is_unsigned<bool>::value

標準に従って明確に定義されていますか?

typename std::make_unsigned<bool>::typeは明確に定義されていません。

57
Vincent

boolには署名の概念はありません。 [basic.fundamental]/6から:

タイプboolの値は、trueまたはfalseのいずれかです。 [signedunsignedshort、またはlongboolタイプまたは値はありません。 — 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です。

64
Kerrek SB

はい、他の単項型の特性と同様に、明確に定義されています。

C++ 14(n4140)20.10.4/2「単項型の特性」の義務:

これらの各テンプレートは、対応する条件がtrueの場合、BaseCharacteristicがtrue_type、それ以外の場合はfalse_typeのUnaryTypeTrait(20.10.1)になります。

20.10.1/1:

naryTypeTraitは、型のプロパティを示します。これは、1つのテンプレート型引数と、オプションで、記述されているプロパティの定義に役立つ追加の引数を取るクラステンプレートでなければなりません。これはDefaultConstructibleCopyConstructibleで、テンプレートの特殊化であるBaseCharacteristic、から直接的または間接的にパブリックかつ明確に導出されますintegral_constant (20.10.3)、テンプレートの引数integral_constantは、記述されている特定のプロパティの要件によって決定されます。 BaseCharacteristicのメンバー名は非表示にならず、UnaryTypeTraitで明確に使用できます。

このことから、 "signedness"の概念が型にとって意味があるかどうかにかかわらず、std::is_unsigned<T>::valueの構造は、あらゆる型Tに対して明確に定義する必要があります。

10
Angew

はい、明確に定義されており、結果はstd::is_unsigned<bool>::value == trueになります。

std::is_signed のドキュメントには、

Tが符号付き算術型の場合、メンバー定数値はtrueになります。その他のタイプの場合、値はfalseです。

それで、あなたが std::is_arithmetic を見れば

Tが算術型(つまり、整数型または浮動小数点型)の場合、メンバー定数値はtrueになります。その他のタイプの場合、値はfalseです。

最終的に std::is_integral につながります

Tが整数型かどうかをチェックします。 Tが型boolcharchar16_tの場合、trueに等しいメンバー定数値を提供しますchar32_twchar_tshortintlonglong long、または符号付き、符号なし、cv修飾のバリアントを含む、実装定義の拡張整数型。それ以外の場合、値はfalseになります。

興味深いことに、別の関数 std::numeric_limits::is_signed があり、

std::numeric_limits<T>::is_signedの値は、すべての符号付き算術型ではtrue、符号なし型ではTおよびfalseです。この定数は、すべての専門分野にとって意味があります。

boolの特殊化がfalseとしてリストされている場合、boolが符号なしと見なされることも確認できます。

9
CoryKramer