【问题标题】:How compiler differentiates between over-loaded functions [duplicate]编译器如何区分重载函数
【发布时间】: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


【解决方案1】:

正如你所说,一切都取决于参数类型,可能是通过转换:

#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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    相关资源
    最近更新 更多