鍋あり谷あり

テーマを決めずに適当に書いています。

久々に私の知らないC++ - 初期化されないオブジェクト

先日。
素でタイプミスして

CSomeClass obj = obj;

みたいなことを書いた。
まあこれがコンパイルできることは知っていたんだが、どんなコードが落ちるのが正しいのか、あるいは得意の「未定義」なのかはいまだに知らない。
で。

struct foo{
  foo(){  cout << "default ctor" << endl; }
  foo( const foo & ){  cout << "copy ctor" << endl; }
  foo & operator=( const foo & ){  cout << "op=" << endl;  }
};

foo hoge( const foo & a ){  cout << "hoge" << endl;  return a;  }

void test()
{
  foo a=a;
  foo b=foo(b);
  foo c=hoge(c); // hoge に来た後でコピーコンストラクタ。
}

こんなことをしてみると、gcc でもマイクロソフトコンパイラでも、コピーコンストラクタしか呼ばず、デフォルトコンストラクタには来ない。

初期化を迂回するので、この手のミスは遅効性のクラッシュを招き、わかりにくいトラブルになる。くわばらくわばら。

こんなコードが言語仕様上許されるのはまあ理解する(賛成はしない)が、こんなことを書いても警告が全く出ないのは、賛成できないし理解もしない。

#写真と本文は関係ありません。