已知以下示例违反了严格的别名规则,因此经过优化和未经优化会产生不同的结果:
int foo( float *f, int *i ) {
*i = 1;
*f = 0.f;
return *i;
}
int main() {
int x = 0;
std::cout << x << "\n"; // Expect 0
x = foo(reinterpret_cast<float*>(&x), &x);
std::cout << x << "\n"; // Expect 0?
}
但是通过不同类型的reinterpret_cast指针访问对象无论如何都是UB。
我现在想知道如何修改示例以仍然打破严格别名规则,但由于 reinterprect_cast 而没有 UB
严格别名规则和“UB from reinterpret_cast
”之间实际上并没有
区别:严格别名规则只是编译器对
reinterpret_cast
相关规则的名称,其优化假设代码是遵循该模式。 (特别是,您可以 evaluate reinterpret_cast<float*>(&x)
,但您对结果唯一能做的就是将其直接转换回 int*
(或其他一些 similar 类型)。通过它存储是“违反严格的”别名”([basic.lval]/11)。)