Ответ 1
Нет, вы, вероятно, смешиваете разные вещи.
Строгие правила сглаживания не имеют абсолютно никакого отношения к стандарту C99. Строгие правила сглаживания внедрены в части стандарта, которые присутствовали на C и С++ с начала [стандартизованных] раз. Предложение, запрещающее доступ к объекту одного типа через lvalue другого типа, присутствует в C89/90 (6.3), а также в С++ 98 ( 3.10/15). То, что строгое наложение, - не больше, не меньше. Дело в том, что не все компиляторы хотели (или осмелились) использовать его или полагаться на него. Как языки C, так и С++ иногда используются в качестве "высокоуровневых сборочных" языков, а правила строгого сглаживания часто мешают подобным применениям. Именно GCC сделал этот смелый шаг и решил начать полагаться на строгие правила псевдонимов в оптимизации, часто вызывая жалобы от этих "сборочных" типов.
Правда, самый простой способ нарушить строгие правила псевдонимов на С++ - это reinterpret_cast
(и, конечно, C-стиль). Тем не менее, static_cast
также может использоваться для этой цели, поскольку он позволяет нарушать строгий псевдоним, используя void *
в качестве промежуточного типа в "прикованном" литье
int *pi;
...
double *pd = static_cast<double *>(static_cast<void *>(pi));
const_cast
не может нарушить строгий псевдоним в совместимом компиляторе.
Что касается C99... Что C99 действительно вводил, то был классификатор restrict
. Это напрямую связано с псевдонимом, но это не то, что известно как строгое наложение псевдонимов как таковое.