先日に引き続き、同名関数の解決。
実は、catch ハンドラの話を書こうと思っていてソースを書いていたんだが。
同名関数に関わる問題の無理解だか誤解だかがあったので、そちらに変更:
struct baz; struct bar{ bar(){} bar( const baz & ){ cout << "bar::bar(const baz&)" << endl; } }; struct baz { operator bar() const { cout << "baz::op bar() const" << endl; return bar(); } }; void hoge( bar ){ cout << "bar" << endl; } void test() { hoge( baz() ); // cl だと、コンパイルエラー。g++ だと、bar::bar( const baz& )が呼ばれる。 }
私の理解が正しければ、どっちの変換を使えばいいのかが曖昧で、そういう趣旨のエラーが出るのが正しい。
というわけで、マイクロソフトコンパイラの方が正しく、g++ が間違っている。
ように思うんだが、自信はない。
それにしても。コンパイラ作る人は本当に大変だと思う。
結論:暗黙の変換は恐ろしい。