いいえ、おそらく異なるものを混ぜています。
厳密なエイリアシング ルールは、特に C99 標準とはまったく関係ありません。厳密なエイリアシング規則は、[標準化された] 時代の初めから C および C++ に存在していた標準の一部に根ざしています。別の型の左辺値を介してある型のオブジェクトにアクセスすることを禁止する句は、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
修飾子でした。これはエイリアシングに直接関連していますが、それ自体は厳密なエイリアシングとして知られているものではありません。