Betrachten Sie diese zwei Funktionen:Wird beim Konvertieren eines char-Arrays in einen anderen Typ die strikte Alias-Regel verletzt?
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 warnt davor, dass die erste strenge Aliasing Regeln verstößt. Aber die zweite ist in Ordnung.
Clang akzeptiert beide ohne Beanstandung.
Ist die Warnung legitim?
Ja. Das "Objekt" ist hier entweder ein 'char' oder das Array von' char's und der glvalue ist vom Typ 'int'; nichts in https://timsong-cpp.github.io/cppwp/basic.lval#8 deckt diesen Fall ab. –