鍋あり谷あり

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

わかっていたつもりの C++

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