将值转换为bool的魔力
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
s),所以这就是您得到的。它可以通过复制LSB来实现,但您仍然应该从语义上考虑它,而不是从实现上考虑。
同理,int
到bool
的转换被定义为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);
。这是定义良好的: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算术的右值…Type可以转换为bool类型的右值。一个零值…被转换为false;其他值都被转换为true。
所以,因为右值是一个值,你可以说这个值被求值,尽管这有点多余。
- 写入向量<向量<bool>>
- 让bool方法返回其他整数
- 如何在 std::vector 中找到<bool>哪些索引是真的?
- Arduino-C++ bool 不会从 false 变为 true
- 为什么在这种情况下,bool 类型的输出等于 0?
- 显式 std::exception_ptr 转换为 bool 不存在.VS2010 错误?
- 错误:不能使用"显式"说明符声明 bool'
- 为什么 C++ 11 在 ios 类中添加了运算符 bool
- 从标准::字符串到标准::矢量<bool>的快速转换
- 为什么 bool 和 _Bool 如果它们在内存中占用 1 个字节,它们只能存储 0 或 1
- 通过 mpi 发送 c++ 标准::矢量<bool>
- 为什么使用Pool和Bool而不是int8_t或char
- 如何为地图< map<int,int> 、bool > 分配值?
- 为什么更改包含 psapi.h 的顺序会产生编译错误?(标识符 BOOL 未定义)
- 使用 bool 和 const char 重载的 C++ 函数会在没有警告的情况下产生歧义 (MSVC2012)
- 返回 bool 作为 CPP 中 bool 运算符 [] 中的值
- 如何告诉自动推断向量<bool>元素的非引用类型
- 当 Type = bool 时,运算符 bool() 与模板 Type() 运算符冲突
- 为什么"std::set::erase(const key_type&)"返回"size_type"而不是"bool"?
- 将值转换为bool的魔力