3

今天我意识到将值转换为 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。但是btrue,所以我的假设是,当转换为 时bool,值会被评估而不是被复制。

这个假设正确吗?这是标准的 C++ 行为吗?

4

6 回答 6

10

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

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

[conv.integral]C++11 标准在和中涵盖了积分(和布尔)转换[conv.bool]。对于 C 风格的演员表,请参阅[expr.cast][expr.static.cast]

于 2013-06-05T08:26:57.973 回答
4

是的,当转换为 时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.

于 2013-06-05T08:24:42.927 回答
4

它是标准的一部分:

4.12 布尔转换 [conv.bool]

1 算术、无范围枚举、指针或指向成员类型的指针的纯右值可以转换为 bool 类型的纯右值。将零值、空指针值或空成员指针值转换为 false;任何其他值都将转换为 true。std::nullptr_t 类型的纯右值可以转换为 bool 类型的纯右值;结果值为假。

于 2013-06-05T08:29:03.060 回答
3

根据C 风格强制转换的规则(bool)value实际上是一个static_cast. then的第一条规则static_cast开始执行,它计算临时“声明和初始化 ... 为new_type Temp(expression);”的值,即bool Temp(value);. 这是明确定义的:Temptrueiff value != 0。所以是的,value在某种意义上是“评估”的。

于 2013-06-05T08:31:03.483 回答
0

Casting tobool是从普通的旧 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++ 还增加了在类上重载转换的能力booliostream这样做是为了指示流何时处于无效状态:

if(!cout) {
    // Something went horribly wrong with the standard output stream!
}
于 2013-06-05T08:37:47.860 回答
0

ISO/IEC C++ 标准:

4.12 布尔转换 [conv.bool] 1 算术...类型的纯右值可以转换为 bool 类型的纯右值。零值...转换为假;任何其他值都将转换为 true。

所以,由于prvalue是一个值,你可能会说这个值被评估了,尽管这有点夸张。

于 2013-06-05T08:42:41.793 回答