我想问一下C++中的类型转换问题。听说当类型转换存在歧义时编译器应该会报错,但是为了更好地理解,我进行了测试,结果没有报错,而且使用了相当奇怪的函数顺序。那么,在什么情况下会出现这种情况呢?
A foo;
B bar = foo;
它使用了类型转换运算符,但是当我输入:
bar = static_cast<B>(foo);
它使用了单个参数构造函数。
有人能解释一下为什么会出现这种情况吗?
我使用的整段代码:
#include <iostream>
#include <typeinfo>
using namespace std;
class B;
class A {
public:
A() {}
A (const B& x);
A& operator= (const B& x);
operator B();
};
class B {
public:
B() {}
B (const A& x) {
cout << "constructor B" << endl;
}
B& operator= (const A& x) {
cout << "Assign B" << endl;
return *this;
}
operator A() {
cout << "Outer B" << endl;
return A();
}
};
A::A (const B& x) {
cout << "constructor A" << endl;
}
A& A::operator= (const B& x) {
cout << "Assign A" << endl;
return *this;
}
A::operator B() {
cout << "Outer A" << endl;
return B();
}
int main ()
{
A foo;
// First one
B bar = foo;
bar = foo;
foo = bar;
// Second one
bar = static_cast<B>(foo);
B bar2 = static_cast<B>(foo);
foo = static_cast<A>(bar);
B bar3 = foo;
A foo2 = bar3;
A foo3 = B();
foo3 = B();
return 0;
}
编辑:
我的输出:
Outer A
Assign B
Assign A
Copy constructor B
Copy constructor B
Copy constructor A
Outer A
Outer B
Outer B
Assign A
static_cast
也应该如此。 - Bartek Banachewicz