[英]Magic of casting value to bool
今天我意识到为bool施加价值是一种魔力:
int value = 0x100;
unsigned char uc = static_cast<unsigned char>(value);
bool b = static_cast<bool>(value);
sizeof(uc)
和sizeof(b)
返回1
。 我知道uc
将包含0x00,因为只复制了LSB。 但是b
将是true
,所以我的假设是,当转换为bool
,值被评估而不是复制。
这个假设是否正确? 这是标准的C ++行为吗?
这没有什么神奇之处。 从int
到unsigned char
的转换定义为value % 256
(对于8位char
),这就是你得到的。 它可以实现为复制LSB,但你仍然应该在语义意义上考虑它,而不是实现。
同样,将int
转换为bool
定义为value != 0
,所以再次,这就是你得到的。
[conv.integral]
和[conv.bool]
的C ++ 11标准涵盖了积分(和布尔)转换。 对于C风格的演员表,请参阅[expr.cast]
和[expr.static.cast]
。
是的,当转换为bool
,将评估值,而不是复制。
实际上,在您的示例中,只要value
不为0
, b
就为true
。
更新:从C ++ Primer第5版第2.1.2章引用:
When we assign one of the nonbool arithmetic types to a bool object, the result is false if the value is 0 and true otherwise.
它是标准的一部分:
4.12布尔转换[conv.bool]
1算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为bool类型的prvalue。 零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true。 类型为std :: nullptr_t的prvalue可以转换为bool类型的prvalue; 结果值为false。
根据C风格的强制转换规则 , (bool)value
实际上是static_cast
。 static_cast
的第一个规则然后开始,它计算临时“声明和初始化的值......如new_type Temp(expression);
”,即bool Temp(value);
。 这是明确定义的:如果value != 0
Temp
为true
value != 0
。 所以是的, value
在某种意义上是“评估”的。
转换为bool
是一个继承自普通旧C的特性。最初,C没有bool
类型,在if
语句中使用其他类型很有用,如下所示:
int myBool = 1;
if(myBool) {
// C didn't have bools, so we had to use ints!
}
void* p = malloc(sizeof(int));
if(!p) {
// malloc failed to allocate memory!
}
当你转换为bool
,它的行为就像你将语句放在if
。
当然,C ++向后兼容C,所以它采用了这个功能。 C ++还添加了将转换重载为类的bool
功能。 iostream
执行此操作以指示流何时处于无效状态:
if(!cout) {
// Something went horribly wrong with the standard output stream!
}
ISO / IEC C ++标准:
4.12布尔转换[conv.bool] 1算术...类型的prvalue可以转换为bool类型的prvalue。 零值...转换为false; 任何其他值都转换为true。
因此,由于prvalue是一个值,你可能会说该值得到了评估,尽管这是一种多样性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.