函数重载的规则

Sof*_*e_t 2 c++ overloading

看看这段代码(例如):

#include <iostream>
void print(unsigned int value);
void print(float value);

int main() {
    print('a');
    print(0);
    print(3.14159);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到下一个错误:

'print(char)' 不明确

这里真正的问题是什么?我知道不止一个函数适用于主函数(打印函数)的任何调用。但真正的规则是什么function overloading(我怎样才能知道什么适合什么,哪些类型之间存在强制转换等等)

我如何知道不止一个函数适合该调用?(更多示例:不明显如何理解这两个函数适合调用)

#include <iostream>

void print(unsigned int value);
void print(int value);

int main() {
    print(2.5);
}
Run Code Online (Sandbox Code Playgroud)

Fra*_*ler 5

当您处理函数重载时,编译器会在幕后执行大量工作来执行函数重载解析。此处列出的详细信息非常好,但是我可以提供一些可能有用的链接,并尝试描述一些更重要的部分。


有3种可能的结果:

  • 找到匹配项。调用被解析为特定的重载
  • 未找到匹配项。参数不能与任何重载匹配
  • 发现不明确的匹配。参数匹配多个重载

编译器执行操作的基本顺序是:

  • 根据参数列表查找精确匹配
  • 尝试通过晋升寻找匹配对象
  • 尝试通过标准转换找到匹配项
  • 尝试通过用户定义的转换找到匹配项

那么如何判断调用是否有歧义呢?

由于每个重载都必须具有唯一的参数,并且由于所有标准转换和所有用户定义的转换都被认为是相同的;如果函数调用通过标准或用户定义的转换匹配多个有效的声明-定义候选,则结果将是不明确的。


从你的例子来看:

void print( unsigned int value );
void print( float value );

print( 'a' );
print( 0 );
print( 3.14159 ); 
Run Code Online (Sandbox Code Playgroud)

在C++的情况下print( 'a' );无法找到精确匹配。它将首先尝试提升'a'为 an int,但没有print(int)声明定义的函数。然后它将尝试使用标准转换,它可以转换'a'为 anunsigned int和 a floating pointvalue。由于所有标准转换都被认为是相等的,这会导致歧义。


要解决这种歧义,您可以简单地declare-define使用所需的版本print( type );,也可以将类型显式转换为提供的重载参数类型之一。