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