Рассмотрим эти две функции:Лилирование массива символов другому типу нарушает правила строгого сглаживания?
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 принимает как без претензий.
Является ли предупреждение законным?
Да. «Объект» здесь является либо «char», либо массивом 'char', а glvalue имеет тип' int'; ничего в https://timsong-cpp.github.io/cppwp/basic.lval#8 не распространяется на этот случай. –