【发布时间】:2013-06-05 08:21:21
【问题描述】:
今天我意识到将值转换为布尔值是一种魔法:
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++ 行为吗?
【问题讨论】:
-
这是一种黑暗艺术。
-
一切不是
0都是真的,因为0x100不是0... -
我确定这是对其他一些 SO 问题的欺骗,但无论如何,从 C++03 开始:“算术、枚举、指针或指向成员类型的指针的右值可以转换为bool 类型的右值。零值、空指针值或空成员指针值转换为 false;任何其他值都转换为 true。"
-
@MichaelBurr 在 SO 上也找不到那个“骗子”。甚至 Google 博士也没有在这里帮助我。
-
另请注意,严格来说,从
int到unsigned char的转换也是“评估”的。评估结果导致 lsb 仅在二进制补码机器上被复制(诚然,这几乎是当今所有的机器)。例如,在 32 位补码机器上,-1 将表示为0xfffffffe,但转换unsigned char uc = (unsigned char)(-1);将导致uc == 0xff。