将char数组转换为其他类型会违反严格别名规则吗?

Joh*_*nck 13 c++ strict-aliasing compiler-warnings language-lawyer reinterpret-cast

考虑这两个功能:

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);
}
Run Code Online (Sandbox Code Playgroud)

GCC警告说,第一个违反严格别名规则.但第二个是好的.

Clang接受了两个没有投诉.

警告是否合法?

Mar*_*ica 9

警告是合法的.f2不行(这是未定义的行为),它只是不会引发警告.

我怀疑f2没有引起警告的原因是:

int f3()
{
    int i = 0;
    char *ptr = reinterpret_cast<char*>(&i);
    return *reinterpret_cast<int*>(ptr);
}
Run Code Online (Sandbox Code Playgroud)

完全合法的.您可以使用char*(或a void*)作为"通用指针" - 只要在访问之前转换回正确的类型.海湾合作委员会显然要小心避免警告f3,但不以警告为代价f2.

Clang没有警告任何一个f1f2- 但它不是必须的.

  • 需要标准报价。 (5认同)