铸造价值的魔法布尔

今天我意识到给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 ++行为?

Solutions Collecting From Web of "铸造价值的魔法布尔"

没有什么不可思议的。 从intunsigned char的转换被定义为value % 256 (对于8位char ),所以这就是你得到的。 它可以被实现为复制LSB,但是你仍然应该在语义上而不是在实现中思考。

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

积分(和布尔)转换由[conv.integral][conv.bool]的C ++ 11标准覆盖。 对于C风格的转换,请参见[expr.cast][expr.static.cast]

这是标准的一部分:

4.12布尔转换[conv.bool]

1算术,非范型枚举,指针或指向成员类型的指针可以转换为布尔类型的前值。 零值,空指针值或空成员指针值被转换为false; 任何其他值都转换为true。 std :: nullptr_t类型的前值可以被转换为类型为bool的prvalue; 结果值是错误的。

是的,当铸造到bool ,价值评估,而不是复制。

其实在你的例子中,只要value不是0b就是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.

根据C风格转换的规则 , (bool)value实际上是一个static_caststatic_cast的第一个规则然后踢,计算临时的声明和初始化…的值作为new_type Temp(expression); “,即bool Temp(value); 。 这是明确的:如果value != 0 Temptrue 。 所以是的, 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算术类型的前值可以转换为布尔类型的前值。 零值…被转换为假; 任何其他值都转换为true。

所以,由于一个价值是一个价值,你可能会说价值被评估,尽管这是一种pleonastic。