Если вы избежите каких-либо проблем, связанных с выравниванием, ваш код попадет в категорию программ, которые авторы Стандарта могли ожидать, что реализации качества будут обрабатываться с пользой, но какой раздел N1570 6.5p7 Стандарта позволит реализациям обрабатыватьпроизвольным образом.Обратите внимание, что способ написания Стандарта C, даже что-то вроде:
struct foo {int x;} s = {0};
s.x = 1;
, попадает в эту же категорию, потому что Стандарт не описывает каких-либо обстоятельств, при которых lvalue типа int
может использоваться длявлияет на объект типа struct foo
, а определение lvalue не учитывает идею о том, что lvalue может иметь тип int
, но иметь связь 6.5p7 с каким-либо другим типом.
Нет причинпочему любой компилятор качества должен испытывать трудности с распознаванием того кода, который преобразует T1*
в T2*
и передает его функции, которая действует на T2*
, может получить доступ к объекту типа T1*
,В отсутствие флага -fno-strict-aliasing
gcc и clang сознательно закрывают глаза на такие возможности, но использование этого флага заставит их вести себя как качественные компиляторы.