10

考虑这两个功能:是否将char数组转换为另一种类型违反严格别名规则?

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

是的。这里的“object”或者是char或者是char的数组,而glvalue的类型是int。 https://timsong-cpp.github.io/cppwp/basic.lval#8中没有包含这种情况。 –

回答

8

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

我怀疑f2不会引发警告的原因是:

int f3() 
{ 
    int i = 0; 
    char *ptr = reinterpret_cast<char*>(&i); 
    return *reinterpret_cast<int*>(ptr); 
} 

完全法律。您可以使用char*(或void*)作为“通用指针” - 只要您在访问之前回到正确类型。海湾合作委员会显然要小心避免关于f3的警告,代价是不要警告关于f2

Clang未能对f1f2发出警告 - 但它不是必需的。

+0

需要标准报价。 –

相关问题