隐式转换的优先级

priority of implicit conversions

本文关键字:优先级 转换      更新时间:2023-10-16

我有两个可以互换的类。可以将A转换为B和B可以转换为A。我想要的是指定A转换为B的一种方法,但仍然可以做以下操作:

B b = A();
B b; b = A();

我要避免的是这个问题: b b = q?a():b();

错误:条件表达是模棱两可的;" A"可以转换为" B",反之亦然

我已经尝试了一系列明确的设置,但是我无法完全弄清楚这是否可能。我宁愿不必在这些上拨打static_cast。

struct B;
struct A {
    int a;
    A () {
    }
    A (B b);
    explicit operator B ();
};
struct B {
    int b;
    B () {
    }
    B (A a);
    explicit operator A ();
};
A::A (B b) {
}
A::operator B () {
    B b;
    return b;
}
B::B (A a) {
}
B::operator A () {
    A a;
    return a;
}
int main () {
    int q;
    A a;
    B b;
    A ab = q ? a : b;
    B b2 = a;
}

解决方案是这样做的A ab = q ? (A)a : (A)b;,以这种方式明确施放您的代码试图隐式执行此操作。