当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《是否定义了std::is_unsigned<bool>::value?》经验,为你挑选了4个好方法。

我想知道是否

std::is_unsigned::value

根据标准是否明确定义?

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



1> Kerrek SB..:

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

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

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

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



2> Columbo..:

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

如果is_arithmetic::valuetrue,结果相同
bool_constant::value; 除此以外,false

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

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

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

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


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


有人会详细说明downvote吗?
@Damon等等,我看不出你的言论如何适用于我的判决.我提到在评估`false
3> Reinstate Mo..:

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

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::value必须为任何类型定义良好T,无论"签名"的概念是否对类型有意义.



4> CoryKramer..:

是的它定义明确,结果应该是 std::is_unsigned::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::is_signed都是.此常量对所有特化都有意义.trueTfalse

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


@IlyaPopov在大多数情况下,cppreference会引用标准的逐字记录,并注明它适用的版本(C++ 03/11/14/etc).
推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有