2012-09-05 13 views
9

は、テンプレート引数が変更されているので、明らかに、この場合には作業をdoesntの静的キャスト安全constポインタのベクトルへのポインタのベクトルからの再解釈は安全ですか?

vector<int*> a; 
const vector<const int*>& b = reinterpret_cast<const vector<const int*>&>(a); 

この変換タイプです。しかし、この再解釈キャストを行うことによって、私は本質的に同じタイプのconstnessを追加するだけです。これはすべての実用的な目的のために安全であるべきですか?

+2

現実的に間違っているかもしれない1つの方法(テストでこれを確認していませんが)は厳密なエイリアシングです。オプティマイザは、 'b'が' a'と同じメモリを参照していないと仮定することができます(これは、エイリアシングと互換性のない型を持つためです)。その後、オプティマイザはそのトリックを行い、 'a'や' b' *が有効に*同じメモリを参照していれば、順序を変更したり削除したりしないものを再注文または削除します。だから、同じレイアウトが必要ですが、それが "働く"ための十分な条件ではありません。 –

+1

これを見るもう一つの方法は、参照やポインタ型への 'reinterpret_cast'の結果が*基本的には役に立たず、元の型に変換する以外には機能しません。オブジェクトの実際の型をエイリアシングするのに合法であるか、(b)実行している特定のことをサポートしているかどうかの特定の保証があります。いずれも適用されないときは、自分以外のタイプでオブジェクトを参照しないでください。そうすることは、「型打ち」とも呼ばれます。 –

答えて

7

参照を無関係な型に変換するのと同様に、定義されていない振る舞いをします。「安全」と定義しないと安全ではありません。

+0

ポインターのベクトルがすべてアドレスの後に同じ構造を持つと仮定するのは大丈夫でしょうか?または、ポインタのタイプのために構造体が実際に変更される可能性があります。 – user1353535

+3

@ user1353535:いいえ、ライブラリの実装は自由にテンプレートを特化できますが、好きです。異なるスペシャライゼーションがレイアウトに適合する必要はありません。 –

+0

それで、もしそのライブラリができないユーザ定義の型が、おそらく特殊化すれば? – user1353535

関連する問題