投向布尔时得不到1

Joã*_*ulo 1 c++ casting boolean

我有以下代码:

#include <iostream>

void f(void* buffer) {
    int x = static_cast<bool>(*(char*)buffer);
    int y = static_cast<bool>(*(bool*)buffer);
    std::cout << x << " " << y;
}

int main() {
    int a = 255;
    f(&a);
}
Run Code Online (Sandbox Code Playgroud)

在GCC 9.1上,我得到以下输出:

1255

在这种情况下,为什么将强制转换bool(char*)强制转换结果x为1,并将强制强制转换bool(bool*)强制转换结果y为255?

eer*_*ika 5

为什么用(bool *)强制转换为bool ...?

因为程序的行为是不确定的。

标准说(引用最新草案):

[basic.lval]

如果程序试图通过glvalue访问对象的存储值,该glValue的类型与以下一种类型不相似([conv.qual]),则行为未定义

  • 对象的动态类型,
  • 类型是与对象的动态类型相对应的有符号或无符号类型,或者
  • 字符,无符号字符或std :: byte类型。

bool与动态类型不同buffer,既不是也不unsignedunsigned对应类型,也不是char unsigned charstd::byte。因此,行为是不确定的。

为什么用(char *)强制转换为布尔值会导致x为1

因为的第一个字节a包含一个不代表零的值。是否会这样取决于CPU体系结构。整数的字节顺序由实现定义。

请注意,在这种情况下,行为将得到很好的定义,因为char在引用的规则中将其列为例外之一。