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.
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.
Il n'y a pas de notion de ce paramètre pour bool
. À partir [de base.fondamentaux]/6:
Les valeurs de type
bool
sont soittrue
defalse
. [Note: Il n'existe pas designed
,unsigned
,short
oulong
bool
types ou des valeurs. - fin de la remarque] les Valeurs de typebool
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
.
is_unsigned
est défini dans [meta.unaire.comp]/2
Si
is_arithmetic<T>::value
esttrue
, le même résultat quebool_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 convertietrue
.
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' bool
ean 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.
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èleintegral_constant
(20.10.3), avec les arguments du modèleintegral_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.
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
esttrue
pour tous arithmétique signée typesT
etfalse
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 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.