关于使用std::bit_cast将非'\0'、非'\1'的char转换为bool的技术问询
关于使用
std::bit_cast将非'\0'、非'\1'的char转换为bool的技术问询 嘿,这个问题问得挺细致的,我来给你掰扯明白~
首先给你个明确结论:完全可以用std::bit_cast做这个转换,而且转换后的bool值一定是true,下面给你拆解背后的逻辑:
- 先搞懂
std::bit_cast的本质:它就是个「字节级复印机」,不会对源值做任何语义转换,只是把源对象的每一个字节原封不动地拷贝到目标类型的内存空间里,纯纯的内存位复制,没有任何额外处理。 - 再看C++标准对
bool类型的硬性规定:- 代表
false的bool对象,它的所有内存位必须全为0; - 代表
true的bool对象,只要内存表示和false不一样就行——换句话说,只要内存里有至少一个位是非0的,这个bool值就是true。
- 代表
回到你给的代码例子,'\2'对应的char值是2,它的内存字节肯定不是全0(不管你的char是有符号还是无符号,只要值非0,字节就不可能全是0)。当std::bit_cast<bool>把这个非0字节拷贝到bool对象的内存后,这个bool的内存表示显然不符合false的全0要求,所以它对应的布尔值必然是true。
你写的这个程序里,constexpr bool x的值是true,main函数返回x时,C++会把布尔值true转换成整数1,所以最终程序的返回值会是1。
内容来源于stack exchange
相关产品推荐
相关产品推荐

