【发布时间】:2019-02-16 10:00:24
【问题描述】:
我明白什么是函数重载。但是,我很好奇编译器如何区分这些重载函数。比方说,我有以下两个重载函数定义。
#include <iostream>
int sum(int a, int b);
int sum(vector<int> a, vector<int> b);
那么,编译器是如何决定调用哪个函数的呢?我理解逻辑,它根据参数的数据类型进行区分。但是,它是如何实现的呢?
【问题讨论】:
-
“但是,它是如何实现的?” 由编译器类型解析逻辑?
-
Name mangling 是其中的一部分。
-
我在答案中放了一些例子,包括使用转换
-
当您调用函数时,编译器会按
和 分解所有函数,编译器会查找名称,然后开始尝试匹配输入类型。匹配输入的规则可能很长而且很吓人,但大多数情况下它只是归结为首先寻找精确匹配,然后尝试可用的隐式类型转换来获得匹配。 tldr 现在将函数的每个部分都视为一个“标记”,例如 name、type1、type2。名称实际上是一个字符串,类型来自在程序编译时构建的列表。该调用被分解为类似的标记。现在很容易匹配。
标签: c++ overriding overloading