C ++会自动将bool
值设置为true
或false
,即使该类型实际上包含1个字节的值。
所以bool(123) == true
是真的,
int i = 123;
bool b = i;
int j = b;
j
取值1
。
但是当reinterpret_cast
与bool*
指针一起使用时,情况仍然如此吗? E.g。
static_assert(sizeof(bool) == 1, "assuming sizeof(bool) is one in this example...");
std::uint8_t i = 123;
bool* b = reinterpret_cast<bool*>(&i);
int j = *b; // j becomes 1
if(*b == true) ... // condition is true
这些结果是否保证是真实的,还是未定义的行为。 (即可以依据假设bool
个对象已在内部表示为1
和0
来编译。
答案 0 :(得分:6)
来自[basic.lval]:
如果程序试图通过除了其中一个之外的glvalue访问对象的存储值 以下类型的行为未定义:
(10.1) - 对象的动态类型,
(10.2) - 对象的动态类型的cv限定版本,
(10.3) - 与对象的动态类型类似的类型(如4.4中所定义),
(10.4) - 对应于对象动态类型的有符号或无符号类型的类型,
(10.5) - 对应于动态类型的cv限定版本的有符号或无符号类型 对象,
(10.6) - 一种聚合或联合类型,包括其元素中的上述类型之一或非静态类型 数据成员(包括,递归地,子聚合的元素或非静态数据成员或 包含联盟),
(10.7) - 一种类型,它是对象动态类型的(可能是cv限定的)基类类型,
(10.8) -char
或unsigned char
类型。
您尝试通过类型为uint8_t
的glvalue访问bool
的存储值。这不符合这8个类别,因此行为未定义。