gpt4 book ai didi

c++ - C++ 中的强制转换顺序

转载 作者:IT老高 更新时间:2023-10-28 22:41:43 26 4
gpt4 key购买 nike

我想问一下 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com