2017-01-10 3 views
0
struct Base { 
    int i, j; 
}; 

struct Derived : Base {}; 

、我々は次ない場合:派生クラスには余分なデータメンバーがありません。派生オブジェクトに基本オブジェクトを静的にダウンキャストしても安全ですか?上記のシナリオでは

Base b; 
auto& d = static_cast<Derived&>(b); 
d.i = 1; 

それは未定義の動作になりますか?

注::何らかの理由で、自動生成されたGoogleのprotobufライブラリのコードを編集できません。したがって、より多くの型の& APIを提供するカスタムクラスにこれらのクラスを拡張しますが、余分なデータメンバーはありません。

+0

@pSoLT、ありがとう。 [C++でのStatic_castを使用したダウンキャスト](http://stackoverflow.com/q/6322949/514235)それは強く関連しています。このQnでは、サイズが潜在的に同じであるかどうかを知りたいと思っています。ところで、誰かがその投稿の受け入れられた答えがこのQnにも対応していると感じたら、誰かが簡単な言葉で説明することができれば素晴らしいだろう。私はちょうど標準からその通路を読んでいる間に失われた。 :-) – iammilind

答えて

2

はい、これは未定義の動作です。 static_castを使用して、基本クラスからオブジェクトがインスタンスではない派生型にキャストすることは、未定義の動作です。

無効な型の変数(動的型、動的型の基本クラス、charまたはunsigned char型など)を使用してオブジェクトにアクセスすることによって厳密なエイリアシング規則を破棄します。

+0

私は実用的にも注意すべきだと思います。私はダウンキャストを検出し、有害なことを行うコンパイラは考えられません。このような行動の例は非常に高く評価されます。 –

+1

@ Cheersandhth.-Alf:今日のコンパイラライターが奇妙に動作するかどうかに関わらず、コンパイラは特定の入力が未定義の動作を引き起こすケースを識別し、常に同じ値を返す条件テストを排除することができます。それ以外の場合はすべてそのような「最適化」は、入力値についてある種の前提を作るためにコンパイラを招待する指示文で達成できるものとほぼ同程度のコスト/便益比を提供すると懐疑的だが、私はファッションを制御しない。 – supercat

関連する問題