gpt4 book ai didi

c++ - 函数重载变得模棱两可

转载 作者:行者123 更新时间:2023-11-30 00:47:50 24 4
gpt4 key购买 nike

重载函数时:

void add(int a)
{
a=7;
cout<<"int";
}
void add(double a)
{
a=8.4;
cout<<"double";
}
void add(int *b)
{
*b=4;
cout<<"pointer";
}
int main()
{
char i='a'; //char
add(i);
return 0;
}

输出:int

尽管没有将数据类型 char 作为参数的函数,但它工作正常。

但是当编译成下面的代码时:

void add(char a)
{
a='a';
cout<<"int";
}
void add(double a)
{
a=8.4;
cout<<"double";
}
void add(int *b)
{
*b=4;
cout<<"pointer";
}
int main()
{
int i=4; //int
add(i);
return 0;
}

给出错误(编译器 gcc):

cpp|21|error: call of overloaded 'add(int&)' is ambiguous

这背后的逻辑是什么?以及如何跟踪此类代码的控制传递或输出?

最佳答案

这个例子归结为整数提升和整数转换之间的区别。简而言之,促销是:

A prvalue of an integer type other than bool, char16_t, char32_t, or wchar_t whose integer conversion rank (4.13) is less than the rank of int can be converted to a prvalue of type int if int can represent all the values of the source type; otherwise, the source prvalue can be converted to a prvalue of type unsigned int. [...] These conversions are called integral promotions.

而整数转换更通用:

A prvalue of an integer type can be converted to a prvalue of another integer type. [...] The conversions allowed as integral promotions are excluded from the set of integral conversions.

就重载决议而言,整数提升是比整数转换更好的转换。


在第一个例子中,我们有:

add(int );    // (1)
add(double ); // (2)
add(int* ); // (3)

并使用 char 调用。只有前两个是可行的,都涉及转换。 (1)涉及一个Integer Promotion,其中有rank Promotion。 (2)涉及到一个 float 转换,有秩转换。 Promotion 的排名高于 Conversion,因此 (1) 无疑是首选。 enter image description here

现在,在第二个例子中,我们有:

add(char );   // (1)
add(double ); // (2)
add(int* ); // (3)

并且正在使用 int 调用。再一次,只有前两个是可行的,并且都涉及转换。 (1) 这次涉及整数转换(因为char 的秩低于int)和 (2) 仍然涉及浮点整数转换,两者具有相同的等级:转换。由于我们有两个排名相同的转换,因此没有“最佳”转换,因此没有最佳可行候选者。因此,我们有一个模棱两可的决议。

关于c++ - 函数重载变得模棱两可,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33504353/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com