この警告が表示されます。定義された動作が欲しいのですが、このコードをそのままにしておきたいです。エイリアシングルールに違反するのはいつですか?
警告:型のパンニングされたポインターを間接参照すると、厳密なエイリアスのルールが破られます[-Wstrict-aliasing]
文字列はPODである私自身の文字列です。このコードはCから呼び出されます。Sはintである可能性があります。文字列はほとんどですstruct String { RealString*s; }
が、テンプレート化されたヘルパー関数です。Stringがポッドであり、4バイトであり、intが4バイトであることを確認するために、静的アサーションを実行します。また、すべてのポインターが>=NotAPtrであるかどうかをチェックするアサーションを作成しました。それは私の新しい/mallocオーバーロードにあります。あなたが提案するなら、私はそのアサーションを文字列に入れるかもしれません
私が従うルール(主に文字列はポッドであり、常にintと同じサイズです)を考慮すると、エイリアシングルールに違反しても問題ありませんか?これは、それを正しく破っている数少ない回数の1つですか?
void func(String s) {
auto v=*(unsigned int*)&s;
myassert(v);
if(v < NotAPtr) {
//v is an int
}
else{
//v is a ptr
}
}