В эти комментарии пользователь @Deduplicator настаивает на том, что правило строгого псевдонима разрешает доступ через несовместимый тип, если любой из псевдонимов или указатель псевдонимов является указателем-указателем, (квалифицированный или неквалифицированный, подписанный или неподписанный char *
). Итак, его утверждение в основном состоит в том, что оба
long long foo;
char *p = (char *)&foo;
*p; // just in order to dereference 'p'
и
char foo[sizeof(long long)];
long long *p = (long long *)&foo[0];
*p; // just in order to dereference 'p'
соответствуют и имеют определенное поведение.
В моем прочитанном, однако, это только первая форма, которая действительна,, то есть когда указатель сглаживания является указателем на char; однако этого нельзя сделать в другом направлении, т.е. е. когда указатель сглаживания указывает на несовместимый тип (кроме символьного типа), указатель с псевдонимом - char *
.
Итак, второй фрагмент выше имел бы поведение undefined.
В чем дело? Это верно? Для записи я уже прочитал этот вопрос и ответ, и там принятый ответ явно заявляет, что
Правила допускают исключение для
char *
. Он всегда предполагал, чтоchar *
псевдонимы других типов. Однако это не сработает по-другому, нет предположения, что ваша структура псевдонизирует буфер символов.
(акцент мой)