先日。
素でタイプミスして
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 でもマイクロソフトコンパイラでも、コピーコンストラクタしか呼ばず、デフォルトコンストラクタには来ない。
初期化を迂回するので、この手のミスは遅効性のクラッシュを招き、わかりにくいトラブルになる。くわばらくわばら。
こんなコードが言語仕様上許されるのはまあ理解する(賛成はしない)が、こんなことを書いても警告が全く出ないのは、賛成できないし理解もしない。
#写真と本文は関係ありません。