将值转换为bool的魔力

Magic of casting value to bool

本文关键字:魔力 bool 转换      更新时间:2023-10-16

今天我意识到将值转换为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++行为吗?

这没什么神奇的。从intunsigned char的转换被定义为value % 256(对于8位char s),所以这就是您得到的。它可以通过复制LSB来实现,但您仍然应该从语义上考虑它,而不是从实现上考虑。

同理,intbool的转换被定义为value != 0,所以,这就是你得到的。

整型(和布尔型)转换在c++ 11标准[conv.integral][conv.bool]中涵盖。对于c风格的强制转换,请参见[expr.cast][expr.static.cast]

这是标准的一部分:

4.12布尔转换[convs .bool]

1算术、无作用域枚举、指针或指针的右值To成员类型可以转换为bool类型的右值。一个零值、空指针值或空成员指针值进行转换虚假的;任何其他值都被转换为true。类型的右值Std::nullptr_t可转换为bool类型的右值;的结果值为false。

是的,当转换为bool时,值被计算,而不是复制。

事实上,在你的例子中,只要value不是0, b就会是true

更新:引自 c++ Primer 5th Edition Chapter 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.

根据c风格强制转换的规则,(bool)value实际上是static_cast。然后static_cast的第一条规则开始生效,它计算临时"声明并初始化……"的值。如new_type Temp(expression);",即bool Temp(value);。这是定义良好的:Temptruevalue != 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算术的右值…Type可以转换为bool类型的右值。一个零值…被转换为false;其他值都被转换为true。

所以,因为右值是一个值,你可以说这个值被求值,尽管这有点多余。