先日に引き続き、同名関数の解決。
実は、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++ が間違っている。
ように思うんだが、自信はない。
それにしても。コンパイラ作る人は本当に大変だと思う。
結論:暗黙の変換は恐ろしい。