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

标签 c++

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

相关文章:

c++ - 协变返回类型和面向对象的编程

c++ - 关于 C++ 声明语法的技巧问题

c++ - Visual Studio 2010 中的 Qt Link 共享库

c++ - 动态函数调用 C++

c++ - 在函数中分配但不在外部分配的私有(private)变量

c++为什么数组没有长度属性

c++ - 一个 STL 字符串类可以容纳多少个字符?

c++ - 在 C++ 中引用字符串

c++ - 如何获取 Posix 系统中的总可用磁盘空间?

c++ - 现代 OpenGL 上下文失败