C++比较运算符不返回true或false

Tri*_*tos 0 c++ operators logical-operators compiler-bug

我有以下计划

int a = 216;
bool* v = (bool*)((void*)&a);
std::cout << (*v == true) << endl;
Run Code Online (Sandbox Code Playgroud)

我希望这个程序打印出真或假,但它打印出216.我编译了它g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2.这是预期的行为还是一些错误?为什么等式运算符会返回与bool不同的类型?

---------编辑---------

我的目的不是为了使其无效,而是将v存储216存储在其存储位置.替代程序可能如下所示:

bool v;
int a = 216;
memcpy(&v, &a, sizeof(bool));
std::cout << (v == true) << endl;
Run Code Online (Sandbox Code Playgroud)

或者我可以使用未初始化的bool指针指向一些随机值,恰好是例如216.

San*_*ker 5

在将指针指向后,你可以做的唯一有效的事情void*是将它强制转换回原始指针类型(在你的情况下int*).你把它投射到bool*了,这会带你进入未定义行为的领域.换句话说,你不能指望任何事情以某种方式发生.

你可能会认为摆脱演员void*会解决这个问题.但是,在将指针强制转换为不同的指针类型后取消引用指针也会导致未定义的行为.

尽管如此,可以通过以下方式轻松实现预期输出:

bool v = (bool) a;
std::cout << (v == true) << std::endl;
Run Code Online (Sandbox Code Playgroud)