C++ 如何确定隐式类型转换优先级?

C++ 如何确定隐式类型转换优先级?,c++,implicit-conversion,C++,Implicit Conversion,代码如下: class A{ public: int val; char cval; A():val(10),cval('a'){ } operator char() const{ return cval; } operator int() const{ return val; } }; int main() { A a; cout << a; } A类{ 公众: int-val; 炭化铝; A():val(10),cval(

代码如下:

class A{
public:
    int val;
    char cval;
    A():val(10),cval('a'){ }
    operator char() const{ return cval; }
    operator int() const{ return val; }
};
int main()
{
    A a;
    cout << a;
}
A类{
公众:
int-val;
炭化铝;
A():val(10),cval('A'){}
运算符char()常量{return cval;}
运算符int()常量{return val;}
};
int main()
{
A A;

cout它不应该编译,因为转换是不明确的;我的编译器也不应该这样:。我不知道你的编译器为什么接受它,或者它如何选择要使用的转换,但它是错误的

您可以通过显式强制转换来解决歧义:

cout << static_cast<char>(a); // uses operator char()
cout << static_cast<int>(a);  // uses operator int()

cout调试会话给出了结果。一个是全局定义的
operator是的,这是不明确的,但造成不明确的原因实际上相当令人惊讶。这并不是说编译器无法区分
ostream::operator,如果一个类可以转换为多个“含义”对于输出,我将使用getter而不是转换运算符。因此返回的int和float转换(尽可能接近)相同的值是一回事,但在我看来,两个不同的值不是一个好主意。此代码不在上编译。我认为编译器错误应该是预期的输出,但对该标准有更好了解的人将是更好的源代码。此处相同:
error:operatiorhuh的歧义重载,VS不编译t他的:
struct A{
    operator char() const{ return 'a'; }
    operator int() const{ return 10; }
};

struct B {
    void operator<< (int) { }
    void operator<< (long) { }
};

int main()
{
    A a;
    B b;
    b << a;
}