次の C のコードには動作が定義されていますか?
int main() {
const int i = 0;
return *(int*)(&i);
}
6.5/7 では、有効なエイリアスとして「オブジェクトの有効な型と互換性のある修飾された型のバージョン」がリストされているため、質問します。しかし、オブジェクトの有効な型は であり、修飾されたバージョンではconst int
ないと思います(ただし、逆は真です)。どちらも互換性がありません(6.7.3/10)。int
const int
int
const int
さらに、6.3.2.3/2 は、修飾子を追加することでポインター型を変換できること、および結果のポインターが等しいことを示しています。6.3.2.3/7 は、任意の 2 つのポインター型を変換できることを示しています (したがって、キャスト(int*)(&i)
自体が許可されます)。しかし、結果のポインターが同じオブジェクトを参照しているとは言っていません。元の型 (この場合は ) に戻すことができるということだけconst int*
です。つまり、エイリアスが合法であっても、ポインター変換が実際に を参照するポインターになることを標準が保証していることは明らかではありませんi
。
それで、標準は実際に私のコードの動作を定義していますか?もしそうなら、これはどこで定義されていますか?
コードが実際に機能することは承知しています。私は、それが機能しない架空の(そして奇妙な)実装を念頭に置いています。その実装が標準に準拠しているかどうか (および、準拠していない場合はどの部分に違反しているか) を尋ねることはできますが、私の想像上の実装が準拠していない他の点がある場合は、水を濁したくありません。誰かが質問に答えるのに役立つと思う場合は、実装について説明します。