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接受了两个没有投诉.
警告是否合法?
警告是合法的.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没有警告任何一个f1或f2- 但它不是必须的.
| 归档时间: |
|
| 查看次数: |
586 次 |
| 最近记录: |