は、これらの二つの機能を考えてみましょう: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は、最初は厳しいエイリアシング規則に違反すると警告しています。しかし、2番目はOKです。
Clangは両方とも申し立てを受け付けません。
警告は正当なものですか?
はい。ここの「オブジェクト」は 'char'か' char'sの配列のいずれかであり、glvalueは 'int'型です。 https://timsong-cpp.github.io/cppwp/basic.lval#8の何もこのケースをカバーしていません。 –