10

Рассмотрим эти две функции:Лилирование массива символов другому типу нарушает правила строгого сглаживания?

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 принимает как без претензий.

Является ли предупреждение законным?

+0

Да. «Объект» здесь является либо «char», либо массивом 'char', а glvalue имеет тип' int'; ничего в https://timsong-cpp.github.io/cppwp/basic.lval#8 не распространяется на этот случай. –

ответ

8

Предупреждение является законным. f2 не в порядке (это неопределенное поведение), это просто не вызывает предупреждения.

Я подозреваю, что причина, по которой f2 не вызывает предупреждение в том, что:

int f3() 
{ 
    int i = 0; 
    char *ptr = reinterpret_cast<char*>(&i); 
    return *reinterpret_cast<int*>(ptr); 
} 

Является полностью легальным. Вы можете использовать char* (или) в качестве «универсального указателя» - при условии возврата к правильному типу перед доступом. GCC явно берет на себя внимание, чтобы избежать предупреждения о f3, за счет отсутствия предупреждения о f2.

Clang не может предупредить ни о f1, либо f2 - но это не требуется.

+0

Нуждается в стандартных котировках. –

 Смежные вопросы

  • Нет связанных вопросов^_^