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