我想知道是否
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
定义不明确。
答案 0 :(得分:64)
bool
没有签名的概念。来自[basic.fundamental] / 6:
bool
类型的值是true
的{{1}}。 [注意:没有false
,signed
,unsigned
或short
long
类型或值。 - 结束记录]bool
类型的值参与整体促销(4.5)。
相比之下,明确地为带符号整数类型(第2段)和无符号整数类型(第3段)调用了签名。
现在适用于bool
和is_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)
,true
为T = bool
。
答案 1 :(得分:23)
is_unsigned
在[meta.unary.comp] / 2中定义为
如果
is_arithmetic<T>::value
为true
,则结果与
相同bool_constant<T(0) < T(-1)>::value
;否则,false
bool
†显然是算术类型(为整数)。现在考虑[conv.bool] / 1:
零值,空指针值或空成员指针值转换为
false
;任何其他值都将转换为true
。
即。 bool(0) < bool(-1)
相当于false < true
,后者保持不变,因为值分别被提升为0
和1
。
因此,is_unsigned<bool>::value
true
是is_signed
(相反,false
是bool
),因为0
ean值对应于无符号值算术运算期间1
和bool
。但是,评估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 描述了类型的属性。它应该是一个采用一种模板类型的类模板 参数和(可选)有助于定义所描述属性的其他参数。应该是
DefaultConstructible
,CopyConstructible
,直接或间接地公开明确地得出,{ 来自 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_t
,char32_t
,wchar_t
,{{1 },short
,int
,long
,long long
或任何实现定义的扩展整数类型,包括任何有符号,无符号和cv限定的变体。否则,value等于false。
有趣的是,还有另一个函数std::numeric_limits::is_signed
表示
对于无符号类型,所有已签名算术类型
std::numeric_limits<T>::is_signed
和true
的{{1}}值为T
。此常量对所有特化都有意义。
false
的专业化列为bool
,其中也确认false
被视为未签名。