std :: is_unsigned <bool> :: value是否定义良好?

我想知道是否

std::is_unsigned<bool>::value 

根据标准是否明确定义?

我问这个问题,因为typename std::make_unsigned<bool>::type没有很好的定义。

bool没有签名的概念。 从[basic.fundamental] / 6:

booltypes的booltrue false 。 [ 注意 :没有有signedunsignedshortlong booltypes或值。 – 结束注释 ] booltypes的bool参与整体促销(4.5)。

相比之下,对于有符号整数types (段落2)和无符号整数types (段落3),显式地调用了signedness。

现在是is_signedis_unsigned特征。 首先,特征总是明确的,但只对算术types有意义。 bool是一个算术types,并且被定义为T(-1) < T(0) is_signed<T>::value被定义(参见表49 T(-1) < T(0) 。 通过使用布尔转换和标准算术转换的规则,我们可以看到T = bool (因为bool(-1)true ,转换为1 ),这是false 。 类似地, is_unsigned<T>::value被定义为T(0) < T(-1) ,这对于T = booltrue的。

is_unsigned在[meta.unary.comp] / 2中定义为

如果is_arithmetic<T>::valuetrue ,则结果与
bool_constant<T(0) < T(-1)>::value ; 否则,是false

bool 显然是一个算术types(是整数)。 现在考虑一下[conv.bool] / 1:

零值,空指针值或空成员指针值被转换为false ; 任何其他值都转换为true

即, bool(0) < bool(-1)相当于false < true ,后者成立,因为值分别被提升为01

因此,由于bool ean值对应于算术运算期间的无符号值01 ,因此is_unsigned<bool>::valuetrue (相反, is_signedfalse )。 然而,评估bool的签名是没有意义的,更不用说执行make_unsigned了,因为它不代表整数,而是状态。


:该模板首先适用于bool的事实取决于其要求条款不存在, bool不是不完整的types([res.on.functions] /(2.5)),没有其他要求在[meta.rqmts]中为UnaryTypeTraits提到

是的,它和其他一元types特征一样是明确的。

C ++ 14(n4140)20.10.4 / 2“一元types特征”的任务:

如果相应的条件为真,则这些模板中的每一个应该是具有true_type的BaseCharacteristic的UnaryTypeTrait(20.10.1),否则是false_type

20.10.1 / 1:

UnaryTypeTrait描述一个types的属性。 它应该是一个类模板,它接受一个模板types参数,并且可以select附加的参数来帮助定义被描述的属性。 它应该是DefaultConstructibleCopyConstructible ,并直接或间接地从其基本属性(它是模板integral_constant (20.10.3)的专门化)中公开和明确地派生出来的,模板的参数由要求的特定属性被描述。 BaseCharacteristic的成员名称不能被隐藏,并且应该在UnaryTypeTrait中明确可用。

std::is_unsigned<T>::value对于任何typesT ,构造std::is_unsigned<T>::value必须被很好地定义,“signedness”的概念是否对types有意义。

是的,它定义的很好,结果应该是std::is_unsigned<bool>::value == true

std::is_signed的文件说

如果T是一个有符号的算术types ,则提供成员常数值等于true。 对于任何其他types,价值是假的。

那么,如果你看看std::is_arithmetic

如果T是算术types(即整型或浮点型 ),则提供成员常数值等于true。 对于任何其他types,价值是假的。

最后导致std::is_integral

检查T是否是整数types。 如果T是typesboolcharchar16_tchar32_twchar_tshortintlonglong long或任何实现定义的扩展整数types(包括任何有符号,无符号,和cv合格的变体。 否则,值等于假。

有趣的是,还有另外一个std::numeric_limits::is_signed函数

对于所有带符号的算术typesTstd::numeric_limits<T>::is_signed值为true ,对于无符号types则为false 。 这个常数对于所有的专业都是有意义的。

如果bool的专业化被列为false ,这也证实了bool被认为是无符号的。