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;
}