我想问一下 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
最佳答案
您的编译器不会提示歧义的原因是您的构造函数和赋值运算符采用 const A/B&
,但 operator A()
和 operator B()
未声明为 const。对于非常量对象的转换,编译器因此更喜欢operator A/B()
。
我觉得剩下的可以用static_cast
conversion的规则来解释,这在您的代码中相当于直接初始化和重载解析中的行为(这就是为什么仅在最后一个示例中调用赋值运算符的原因)。
关于c++ - C++ 中的强制转换顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39508973/