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

时间:2016-01-05 12:59:28

标签: c++ boolean language-lawyer c++14 unsigned

我想知道是否

CREATE PROCEDURE TEST_SP    
AS
BEGIN
    DECLARE @NetworkDBName VARCHAR(255) 
    SET @NetworkDBName = '[MyLinkedServerName]'
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here 
    select * from @NetworkDBName + '.' + testDatabase.dbo.Invoice_tb
END
GO

是否根据标准明确定义?

我问这个问题是因为std::is_unsigned<bool>::value 定义不明确。

4 个答案:

答案 0 :(得分:64)

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

  

bool类型的值是true的{​​{1}}。 [注意:没有falsesignedunsignedshort long类型或值。 - 结束记录] bool类型的值参与整体促销(4.5)。

相比之下,明确地为带符号整数类型(第2段)和无符号整数类型(第3段)调用了签名。

现在适用于boolis_signed特征。首先,特征总是定义良好,但仅对算术类型有意义。 is_unsigned是算术类型,bool定义为is_signed<T>::value(参见表49)T(-1) < T(0)。通过使用布尔转换和标准算术转换的规则,我们发现false的{​​{1}}为T = bool(因为bool(-1)true,转换为1 })。同样,is_unsigned<T>::value定义为T(0) < T(-1)trueT = bool

答案 1 :(得分: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 trueis_signed(相反,falsebool),因为0 ean值对应于无符号值算术运算期间1bool。但是,评估make_unsigned的签名并不是真的有意义,更不用说对它进行bool,因为它不代表整数,而是表示状态。

<小时/> :此模板首先适用于bool的事实取决于其要求条款不存在,std::is_unsigned<bool>::value == true不是不完整类型([res] .on.functions] /(2.5))并且[meta.rqmts]中没有为 UnaryTypeTraits 提及其他要求。

答案 2 :(得分:10)

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

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

  

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

20.10.1 / 1:

  

UnaryTypeTrait 描述了类型的属性。它应该是一个采用一种模板类型的类模板   参数和(可选)有助于定义所描述属性的其他参数。应该是   DefaultConstructibleCopyConstructible,直接或间接地公开明确地得出,{   来自 BaseCharacteristic,,它是模板integral_constant(20.10.3)的特化,   模板integral_constant的参数由特定的要求决定   财产被描述。 BaseCharacteristic的成员名称不得隐藏,也不得隐藏   在UnaryTypeTrait中明确可用。

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

答案 3 :(得分:9)

是的,它定义明确,结果应为T

std::is_signed的文档说

  

如果bool是带符号的算术类型,则提供成员常量值等于true。对于任何其他类型,值为false。

那么如果你看一下std::is_arithmetic

  

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

最终导致std::is_integral

  

检查T是否为整数类型。 提供成员常量值,该值等于true,如果T是char 类型,char16_tchar32_twchar_t,{{1 },shortintlonglong long或任何实现定义的扩展整数类型,包括任何有符号,无符号和cv限定的变体。否则,value等于false。

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

  

对于无符号类型,所有已签名算术类型std::numeric_limits<T>::is_signedtrue的{​​{1}}值为T。此常量对所有特化都有意义。

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