56 votes

Est-ce que std :: is_unsigned <bool> :: valeur bien définie?

Je me demande si

 std::is_unsigned<bool>::value
 

est bien défini selon la norme ou pas?

Je pose la question parce que typename std::make_unsigned<bool>::type n'est pas bien défini.

64voto

Kerrek SB Points 194696

Il n'y a pas de notion de ce paramètre pour bool. À partir [de base.fondamentaux]/6:

Les valeurs de type bool sont soit true de false. [Note: Il n'existe pas de signed, unsigned, shortou long bool types ou des valeurs. - fin de la remarque] les Valeurs de type bool participer à partie intégrante des promotions (4.5).

En revanche, ce paramètre est explicitement appelé pour l' entier signé types (paragraphe 2) et d'entier non signé types (paragraphe 3).

Maintenant, pour l' is_signed et is_unsigned traits. Tout d'abord, les traits sont toujours bien défini, mais seulement intéressant pour l'arithmétique types. bool est un type arithmétique, et is_signed<T>::value est défini (voir Tableau 49) T(-1) < T(0). En utilisant les règles de conversion booléenne et standard de l'arithmétique des conversions, nous verrons que c'est est - false pour T = bool (parce qu' bool(-1) est true, ce qui correspond à 1). De même, is_unsigned<T>::value est défini comme T(0) < T(-1), ce qui est true pour T = bool.

23voto

Columbo Points 11661

is_unsigned est défini dans [meta.unaire.comp]/2

Si is_arithmetic<T>::value est true, le même résultat que
bool_constant<T(0) < T(-1)>::value; sinon, false

bool est clairement un type arithmétique (intégrales). Considérons maintenant [conv.bool]/1:

Une valeur de zéro, la valeur de pointeur null, ou null pointeur de membre de la valeur est convertie en false; toute autre valeur est convertie true.

I. e. bool(0) < bool(-1) est équivalent à false < true, et celle-ci détient puisque les valeurs sont promues 0 et 1, respectivement.

Ainsi, is_unsigned<bool>::value est true (et, à l'inverse, is_signed est false), en raison du fait qu' boolean valeurs correspondent aux valeurs non signées 0 et 1 pendant les opérations arithmétiques. Cependant, il n'a pas vraiment de sens pour évaluer bool's ce paramètre, beaucoup moins effectuer make_unsigned , car il n'a pas représenter des nombres entiers, mais plutôt des états.


: Le fait que ce modèle est applicable à l' bool dans la première place est déterminée par son Exigence de la clause de non-existant, bool n'étant pas un type incomplète ([res.sur.fonctions]/(2.5)) et pas d'autres exigences mentionnées dans [meta.rqmts] pour UnaryTypeTraits.

10voto

Angew Points 53063

Oui, c'est bien définie, comme n'importe quel autre unaire type de trait.

C++14 (n4140) 20.10.4/2 "Unaire traits de type" mandats:

Chacun de ces modèles doit être un UnaryTypeTrait (20.10.1) avec un BaseCharacteristic d' true_type si l' correspondant condition est vraie, sinon, false_type.

20.10.1/1:

Un UnaryTypeTrait décrit une propriété d'un type. Il doit être un modèle de classe qui prend un type de modèle argument et, éventuellement, des arguments supplémentaires qui permettent de définir la propriété d'être décrit. Il doit être DefaultConstructible, CopyConstructible, et publiquement et sans ambiguïté provient, directement ou indirectement, de son BaseCharacteristic, qui est une spécialisation du modèle integral_constant(20.10.3), avec les arguments du modèle integral_constant déterminé par les exigences pour le particulier la propriété d'être décrit. Les noms des membres de la BaseCharacteristic ne doit pas être caché et doit être sans ambiguïté disponibles dans la UnaryTypeTrait.

D'où il suit que la construction std::is_unsigned<T>::value a être bien défini pour tout type T, si la notion de "ce paramètre" a du sens pour le type ou pas.

9voto

Cyber Points 15779

Oui c'est bien définie et que le résultat doit être std::is_unsigned<bool>::value == true

La documentation pour l' std::is_signed dit

Si T est une arithmétique signée type, fournit le membre de la valeur constante égale à true. Pour tout autre type, la valeur est false.

Alors, si vous regardez std::is_arithmetic

Si T est un type arithmétique (c'est un type intégral ou une variable de type point), est le membre de la valeur constante égale à true. Pour tout autre type, la valeur est false.

Qui a finalement conduit à l' std::is_integral

Vérifie si T est un type intégral. Fournit le membre de la valeur de la constante qui est égale à true, si T est le type bool, char, char16_t, char32_t, wchar_t, short, int, long, long long, ou la mise en œuvre définies par l'étendue types integer, y compris toute signed, unsigned, et de cv qualifiés variantes. Sinon, la valeur est égale à false.

Fait intéressant, il existe une autre fonction std::numeric_limits::is_signed que les états

La valeur de std::numeric_limits<T>::is_signed est true pour tous arithmétique signée types T et false pour les types non signés. Cette constante est significative pour toutes les spécialisations.

Où la spécialisation pour bool est répertorié en tant que false, ce qui confirme également qu' bool est considéré comme non signés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X