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

需要標準報價。 –

相關問題