0
  1. クラスを持つと、そのメンバーの初期化順序はコンストラクターで強く定義されます (この質問のように、メンバー間の依存関係を許可するためかもしれませんが、これは設計上の問題だと思います。循環依存関係を想像できます)。
  2. 関数呼び出しがあり、パラメーター評価の順序が定義されていません。C 互換性のためだと思います。
  3. そして、次の「恐ろしいダイヤモンド」問題のエラーがあります。

    struct A {virtual void Print() {}};
    struct B: virtual public A {virtual void Print() {}};
    struct C: virtual public A {virtual void Print() {}};
    struct D: public B, public C {};
    

    コンパイラは、選択するバージョンを認識していません。順序があいまいであると定義されています。この質問で定義されているように(説得力のない答えで)「左から右の深さ優先解決順序」を使用しない、つまりCよりもBを選択しないのはなぜですか?

では、なぜこれらの異なるアプローチが必要なのでしょうか? 3 ではなく 1 に厳密な順序があるのはなぜですか? 1 を未定義のままにしておく方が簡単ではありませんか? それとも 2 は単純に左から右に定義されていますか?

4

1 に答える 1

1

これらは、さまざまなトレードオフを伴う非常に異なる状況です。いずれの場合も考慮する必要があります

  • これらの状況はどのくらいの頻度で発生しますか?
  • 任意の選択が予期しない結果をもたらす可能性はどのくらいありますか?
  • 特定の注文がいつ必要になるかを明示的に指定するのはどれくらい簡単ですか?
  • 特定の順序を強制すると、パフォーマンスにどのようなペナルティが発生しますか?

これらの質問に対する答えは状況ごとに大きく異なるため、さまざまな選択肢があるのは自然なことです。

于 2014-01-05T14:38:25.680 に答える