私は次のコードを持っています:
class Foo;
class Bar;
class Bar {
public:
Bar() {
}
Bar(Foo &foo) {
}
};
class Foo {
public:
Foo() {
}
Foo(Foo &foo) {
}
Foo(const Bar &bar) {
}
};
Bar operator >> (const Bar &left, const Bar &right) { return Bar(); }
Foo a;
Foo b;
Foo c = a >> b;
Visual Studio 10では、上記のコードは正常にコンパイルされます。コンパイラは、Bar
からインスタンス化できることを認識しFoo&
ます。したがって、適切なを呼び出し、operator >>
次にインスタンスを返しBar
、コンストラクタFoo(const Bar &)
を適切に呼び出します。
ただし、GCC4.5は上記のコードをコンパイルしません。次のエラーが出力されます。
error: no matching function for call to 'Foo::Foo(Foo)'
note: candidates are: Foo::Foo(const Bar&)
note: Foo::Foo(Foo&)
note: Foo::Foo()
言語標準によると、なぜ上記が発生し、どのコンパイラが正しいのですか?
編集:
存在するのに、なぜC ++Foo
はの結果として一時オブジェクトを作成するのですか?c = a >> b
Foo(const Bar &)