使用带有bool的reinterpret_cast

时间:2016-05-24 15:52:27

标签: c++ boolean

C ++会自动将bool值设置为truefalse,即使该类型实际上包含1个字节的值。

所以bool(123) == true是真的,

int i = 123;
bool b = i;
int j = b;

j取值1

但是当reinterpret_castbool*指针一起使用时,情况仍然如此吗? 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个对象已在内部表示为10来编译。

1 个答案:

答案 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) - charunsigned char类型。

您尝试通过类型为uint8_t的glvalue访问bool的存储值。这不符合这8个类别,因此行为未定义。