Стандарт не требует, чтобы компиляторы учитывали возможность использования a[anything]
и b[anything]
для доступа к любой части struct item
.В нем перечислены типы lvalue, которые реализации всегда должны позволять использовать для доступа к структуре, такой как struct item
, и среди них нет типов символов, таких как int
.Никакого специального разрешения не требуется, чтобы позволить компилятору предположить, что ни a
, ни b
не будут иметь псевдоним struct item
.
Конечно, компилятору было бы довольно бесполезно разрешать коду приниматьадрес члена структуры или объединения не символьного типа, но на самом деле никогда не разрешать использование результирующего указателя для доступа к члену, даже в случаях, когда псевдонимы не используются (*).Стандарт не делает различий между случаями, которые включают в себя псевдонимы, и случаями, которые этого не делают, и оставляет вопрос о том, когда разрешать доступ к структурам, используя значения типа l, полностью на усмотрение разработчиков.Авторы gcc и clang, возможно, решили, что самый простой способ поддержать использование указателей для структурирования элементов в сценариях сглаживания - это поддерживать их во всех сценариях, но стандарт вряд ли требует такой обработки, и я не думаю, чтоАвторы хотели, чтобы это было.
Стандарт дает возможность реализации воспользоваться преимуществом предположения, что ни a
, ни b
не будет иметь псевдоним c
, и, тем не менее, по-прежнему поддерживать большинство программ, которые должны работать с указателями начлены структуры или профсоюза.Хотя в некоторых случаях было бы полезно использовать больше квалификаторов, подобных __restrict
, я не уверен, какое дополнительное разрешение, по вашему мнению, потребуется для реализации в тех случаях, как тот, который вы показываете.
(*), т.е.ситуации, когда никакие операции не обращаются к области хранения или не получают указатель / ссылку, которая будет использоваться для этого, в моменты, когда существует более новый указатель / ссылка, который также будет использоваться для доступа или обращения к одному и тому же хранилищу конфликтующим образом.