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

Vin*_*ent 56 c++ unsigned boolean language-lawyer c++14

我想知道是否

std::is_unsigned<bool>::value
Run Code Online (Sandbox Code Playgroud)

根据标准是否明确定义?

我问这个问题因为typename std::make_unsigned<bool>::type没有明确定义.

Ker*_* SB 64

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

类型的值bool或者是truefalse.[ :没有signed,unsigned,short,或long bool类型或值.- 结束注释 ]类型的值bool参与整体促销(4.5).

相反,对于有符号整数类型(第2段)和无符号整数类型(第3 段),明确地调用了符号.

现在为is_signed和和is_unsigned特点.首先,特征总是定义良好,但仅对算术类型有意义.bool是一种算术类型,并被is_signed<T>::value定义为(见表49)T(-1) < T(0).通过使用布尔转换和标准的算术转换规则,我们可以看到,这是是falseT = bool的(因为bool(-1)true,它转换成1).同样,is_unsigned<T>::value被定义为T(0) < T(-1),true用于T = bool.


Col*_*mbo 23

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

如果is_arithmetic<T>::valuetrue,结果相同
bool_constant<T(0) < T(-1)>::value; 除此以外,false

bool显然是算术类型(积分).现在考虑[conv.bool]/1:

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

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

因此is_unsigned<bool>::value,true(并且相反地,is_signedfalse),由于boolean值对应于无符号值 0并且1在算术运算期间.然而,评估bool签名并没有多大意义,更不用说make_unsigned它的表现,因为它不代表整数,而是表示状态.


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

  • 有人会详细说明downvote吗? (3认同)
  • @Damon等等,我看不出你的言论如何适用于我的判决.我提到在评估`false <true`时正在应用的整体提升期间被提升为0和1的值.那里没有错.没有人谈论价值表征(尚未). (2认同)

Rei*_*ica 10

是的,它是明确定义的,就像任何其他一元类型特征一样.

C++ 14(n4140)20.10.4/2"一元型特征"的任务:

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

20.10.1/1:

一个UnaryTypeTrait描述了一个类型的属性.它应该是一个类模板,它接受一个模板类型参数,以及可选的其他参数,这些参数有助于定义所描述的属性.它应是 DefaultConstructible,CopyConstructible和公开和明确地衍生,直接或间接从它BaseCharacteristic,其为模板的特殊化integral_constant(20.10.3),用参数传递给模板integral_constant由要求所描述的特定特性确定的.BaseCharacteristic的成员名称不应隐藏,并且应在UnaryTypeTrait中明确可用.

由此可见,构造std::is_unsigned<T>::value必须为任何类型定义良好T,无论"签名"的概念是否对类型有意义.


Cor*_*mer 9

是的它定义明确,结果应该是 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,char32_t,wchar_t,short,int,long,long long,或任何实现所定义的扩展整型,包括任何符号,无符号,和CV-合格的变体.否则,value等于false.

有趣的是,还有另外一个功能std::numeric_limits::is_signed,指出

所有已签名算术类型和无符号类型的值std::numeric_limits<T>::is_signed都是.此常量对所有特化都有意义.trueTfalse

专业化bool列为false,其中也确认bool被认为是未签名的.

  • @IlyaPopov在大多数情况下,cppreference会引用标准的逐字记录,并注明它适用的版本(C++ 03/11/14/etc). (2认同)