Uważają, że te dwie funkcje:Czy rzutowanie tablicy znaków na inny typ narusza zasady ścisłego wygładzania?
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 ostrzega, że pierwszy narusza zasady ścisłego-aliasingu. Ale drugi jest OK.
Clang akceptuje oba bez reklamacji.
Czy ostrzeżenie jest uzasadnione?
Tak. "Obiekt" to tutaj "char" lub tablica 'char's, a glvalue jest typu' int'; nic w https://timsong-cpp.github.io/cppwp/basic.lval#8 nie obejmuje tej sprawy. –