講義形式でも結構自分も勉強になりますね

今日は初期化と代入の違いについてやったんですが、なかなか説明が難しかった。
と、いうのも話してると、これわかる?って確認して、わき道にそれちゃうと自分の脳の中で話を戻すのが大変><

あと、今日自分も勉強になったこと。正直これはコンパイラ先生に怒られるかと思ったがすんなりとおってびっくりした。

class Hoge
{
public:
  Hoge():m_int(0){}
  // そのほかのデフォルト系は省略
private:
  int m_int;
};

int main()
{
  Hoge hoge1;
  Hoge hoge2 = hoge1 = hoge2; // これコンパイル通るんだね・・・

  return 0;
}

この結果は、まずhoge1の代入演算子が呼ばれて、次にhoge2のコピーコンストラクタが呼ばれる。hoge1の代入演算子が呼ばれた時点でhoge2の初期化は終わってないので、当然hoge1は不正な値が代入され、hoge2はその値で初期化される。
これは素直に驚いた。なんでこれが許されるんだろうか。

ちなみにコンパイラVisual Studio 2008(だっけ?) expressionのやつです。