以下程序生成编译错误
error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
(gcc 4.7.3 with -std = c ++ 0x -O3 -Wall -Werror)
#include <cstring>
#include <iostream>
struct S
{
int t;
};
int main3()
{
char data[100];
std::memset(data, 0, 100);
int offset = 15;
// variant #1
const S& s = *reinterpret_cast<const S*>(&data[offset]);
// variant #2
//const S* sPtr = reinterpret_cast<const S*>(&data[offset]);
//const S& s = *sPtr;
std::cout << s.t;
return 0;
}
然而,可以通过取消注释变量#2来修复它,它只使用中间指针变量,而不是直接解除引用。
为什么?两种变体不相同吗?