考虑这两个功能:
int f1()
{
alignas(int) char buf[sizeof(int)] = {};
return *reinterpret_cast<int*>(buf);
}
int f2()
{
alignas(int) char buf[sizeof(int)] = {};
char* ptr = buf;
return *reinterpret_cast<int*>(ptr);
}
GCC警告说,第一个违反严格别名规则。但第二个是好的。
Clang毫无怨言地接受了这两件事。
警告是否合法?
答案 0 :(得分:9)
警告是合法的。 f2
不正常(它是未定义的行为),它只是不会引发警告。
我怀疑f2
没有引发警告的原因是:
int f3()
{
int i = 0;
char *ptr = reinterpret_cast<char*>(&i);
return *reinterpret_cast<int*>(ptr);
}
完全合法。您可以使用char*
(或void*
)作为“通用指针” - 只要您在访问之前转回到正确的类型。海湾合作委员会显然要小心避免警告f3
,但不要警告f2
。
Clang没有对f1
或f2
发出警告 - 但不是必须的。