【发布时间】:2017-05-08 23:49:25
【问题描述】:
考虑这两个函数:
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 毫无怨言地接受了两者。
警告合法吗?
【问题讨论】:
-
是的。这里的“对象”是
char或chars 的数组,glvalue 的类型为int; timsong-cpp.github.io/cppwp/basic.lval#8 中没有任何内容涉及这种情况。 -
@T.C.您的意思是按照标准,将 char 区域别名为其他类型 T 是不可能的?因为这就是可选和变体的工作方式,不是吗。我不禁发现这个想法,如果是真的,对这些实际需求有风险。我认为别名的例外是为此目的包括 char。
标签: c++ language-lawyer compiler-warnings reinterpret-cast strict-aliasing