重载功能。为什么这里模棱两可?

Overloaded function. Why it's ambiguous here?

本文关键字:模棱两可 这里 为什么 功能 重载      更新时间:2023-10-16

我的函数在下面的代码中重载:

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++说这些都是模糊的,尽管第一个的最差转换比第二个的最坏转换要好。">

编译器如何在这里进行隐式转换,从而使哪个候选项是正确的?

文字常量'a''b'的类型为char,因此不存在完全匹配。出现歧义是因为第一个参数与第一个函数匹配,但第二个参数的优选转换是int,与第二个函数匹配。

GCC对此非常明确,发布了以下诊断:

警告:ISO C++说这些是不明确的,即使第一个的最差转换比第二个最好

GCC似乎在说,我可以帮你解决这个问题,但ISO C++不允许。然而,类型协议对良好的代码质量和避免错误很重要。

你可以通过铸造来强制选择:

function( static_cast<int>('a'), static_cast<int>('b') );

或者通过提供CCD_ 5过载。

C++中的doubleintchar之间有implicit转换,因此您应该使用static_cast<int>将数据从char转换为int

function( static_cast<int>(c), static_cast<int>(d) );

这将调用function( int, int );

在您的特定情况下,您使用'a''b'字符文字,如上所述,它们具有implicit conversionsintdouble,因为char变量表示在assignment operator中输入的字符的ASCII值。因此,我们可以通过以下方式初始化unsigned char变量或char

unsigned char a = 97; // the ASCII decimal code for "a"
unsigned char b = 'a'; // translates into 97

由于unsigned charchar变量是8位变量,而int是32位值,因此它们具有隐式转换。

要选择重载A而不是重载B,每个参数到A的转换必须与B的转换一样好或更好,并且至少有一个必须更好。

在您的情况下,A有(精确匹配,积分->浮动(,而B有(积分提升,积分提升(。

精确匹配优于积分提升,但积分提升优于积分->浮动转换。因此,A在第一个自变量中有更好的转换,而B在第二个自变量中。因此,目前还不清楚哪一个总体上更好。

function(char, double)尝试('a', 'b')不需要对'a'进行转换,对'b'进行浮点积分转换(从chardouble(。

对于function(int, int)'a''b'都需要整体提升(从char提升到int(。