我在下面的代码中重载了我的函数:
void function(char x, double y) {
cout << "char, double" << endl;
}
void function(int x, int y) {
cout << "int, int" << endl;
}
int main() {
function('a', 'b');
return 0;
}
当我尝试编译它时,我说:“[警告] ISO C ++说这些是模棱两可的,即使第一个的最差转换比第二个的最差转换更好”
编译器如何在此处进行隐式转换,以使哪个候选者不对,这是不明确的?
答案 0 :(得分:10)
文字常量'a'
和'b'
的类型为char
,因此没有完全匹配。出现歧义的原因是第一个参数与第一个函数匹配,但第二个参数的首选转换为int
,与第二个函数匹配。
GCC对此非常明确,发出以下诊断:
警告:ISO C ++说这些是模棱两可的,即使第一次转换的最差转换比第二次转换的最差转换
GCC似乎在说,我可以为你解决这个问题,但ISO C ++不会允许它。但是,类型协议对于良好的代码质量和避免错误很重要。
您可以通过强制转换来强制选择:
function( static_cast<int>('a'), static_cast<int>('b') );
或提供function( char, char )
重载。
答案 1 :(得分:4)
C ++中的implicit
,double
和int
之间有char
次转化,因此您应该使用static_cast<int>
转换来自{{1}的数据以char
为例。
int
这将调用function( static_cast<int>(c), static_cast<int>(d) );
在您的特定情况下,您使用function( int, int );
和'a'
字符文字,正如我上面提到的,'b'
到implicit conversions
和int
,因为double
变量表示在char
中输入的字符的ASCII值。因此,我们可以通过以下方式初始化assignment operator
变量或unsigned char
:
char
由于unsigned char a = 97; // the ASCII decimal code for "a"
unsigned char b = 'a'; // translates into 97
或unsigned char
变量是8位变量,而char
是32位值,因此它们具有隐式转换。
答案 2 :(得分:2)
对于超载B选择的过载A,A的每个参数的转换必须与B的转换一样好或更好,并且至少一个必须更好。
在你的情况下,A有(完全匹配,整数 - >浮动),而B有(整数提升,整体提升)。
完全匹配优于整数提升,但整体提升优于整数 - >浮动转化。所以A在第一个参数中有更好的转换,而在第二个参数中有B.所以整体上哪个更好是模棱两可的。
答案 3 :(得分:1)
为('a', 'b')
试用function(char, double)
不需要'a'
的转换,'b'
的浮动积分转换(从char
到double
)。
对于function(int, int)
,'a'
和'b'
都需要整体提升(从char
到int
)。