函数重载和读取fdump-tree-all输出

function overloading and reading fdump-tree-all output

本文关键字:fdump-tree-all 输出 读取 重载 函数      更新时间:2023-10-16

我正在查看下面列出的函数重载问题,发现以下代码无法编译。

#include<iostream>
class Test {
   static void fun(int i) {}
   void fun(int i) {}   
};
int main()
{
   Test t;
   return 0;
}

我的理解是,当隐式编译时,成员函数有一个额外的参数,一个指向编译函数中对象的指针。我不确定静态函数会发生什么。现在,为了弄清楚编译器在做什么,我尝试运行g++ -fdump-tree-all failed_overload。cxx,我得到了下面列出的文件:

         failed_overload.cxx.001t.tu
         failed_overload.cxx.002t.class
         failed_overload.cxx.003t.original
         failed_overload.cxx.004t.gimple
         failed_overload.cxx.204t.statistics

我查看了简单的输出,发现如下:

* *

static void Test::fun(int) (int i)
{
  GIMPLE_NOP
}
void Test::fun(int) (struct Test * const this, int i)
{
  GIMPLE_NOP
}
* *

似乎静态函数只有int形参,但成员函数有额外的this形参。如果是这样的话,为什么编译失败?为什么我们不能用相同的签名重载静态函数?

如果静态和非静态函数都使用相同的参数集,那么在类(非静态)的方法调用中,将无法区分程序员是想调用静态函数还是非静态函数。例子:

#include<iostream>
class Test {
   static void fun(int i) { std::cout << 2*i; }
   void fun(int i) { std::cout << i; }   
   void otherFunc() {
      fun(3); // Ambiguity: is static or non-static function intended?
   }
};
int main()
{
   Test t;
   t.otherFunc();
   return 0;
}