我有以下代码:
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 &)
适当地调用构造函数。
但是,GCC 4.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 &)