Hãy xem xét hai chức năng:Việc truyền mảng char sang loại khác có vi phạm quy tắc bí danh nghiêm ngặt không?
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 cảnh báo rằng người đầu tiên vi phạm quy tắc nghiêm ngặt-aliasing. Nhưng thứ hai là OK.
Clang chấp nhận cả hai mà không có khiếu nại.
Cảnh báo có hợp pháp không?
Có. "Đối tượng" ở đây là một 'char' hoặc mảng' char 'và glvalue là kiểu' int'; không có gì trong https://timsong-cpp.github.io/cppwp/basic.lval#8 bao gồm trường hợp này. –