c++ - 编译器如何区分重载函数
问题描述
我明白什么是函数重载。但是,我很好奇编译器如何区分这些重载函数。假设,我有以下两个重载函数定义。
#include <iostream>
int sum(int a, int b);
int sum(vector<int> a, vector<int> b);
那么,编译器是如何决定调用哪个函数的呢?我理解逻辑,它根据参数的数据类型进行区分。但是,它是如何实现的呢?
解决方案
正如您所说,一切都取决于参数类型,可能是通过转换:
#include <iostream>
#include <vector>
using namespace std;
int sum(int, int)
{
cout << "ints" << endl;
}
int sum(vector<int>, vector<int>)
{
cout << "vectors" << endl;
}
class C1 {
public:
operator int() { return 0; }
};
class C2 {
public:
operator int() { return 0; }
operator vector<int>() { vector<int> v ; return v; }
};
int main()
{
sum(1, 2); // ints
sum(1.2, 3); // ints, use conversion from double to int
vector<int> v;
sum(v, v); // vectors
// sum(v, 0); no matching function for call to 'sum(std::vector<int>&, int)'
C1 c1;
sum(c1, c1); // use conversion from C1 to int
C2 c2;
//sum(c2, c2); call of overloaded 'sum(C2&, C2&)' is ambiguous
return 0;
}
编译和执行:
pi@raspberrypi:/tmp $ g++ -pedantic -Wextra c.cc
pi@raspberrypi:/tmp $ ./a.out
ints
ints
vectors
ints
推荐阅读
- macos - cocos studio 打不开我在 Mac 上运行
- amazon-s3 - 将 s3 安装到 wowza ec2:无法“制作”s3fs-fuse
- r - R:如何将文件读入不同拆分的数据表中?
- regex - 正则表达式 - 选择所有没有特定属性且没有新行的
- elasticsearch - 如何在 heartbeat.yml 中添加更多监视器?
- java - 持久化 Spring OAuth2RestTemplate 的刷新令牌
- python - 如何将两个列表按顺序合并到一个新列表中?
- python - Libreoffice-calc:从 shell cmd 行创建一个新工作表
- javascript - 需要将 socket.io 类更改为单例
- cookies - 是否可以使用 Tamper/Greasemonkey 交换用户 cookie/配置文件?