【问题标题】:function overloading and reading fdump-tree-all output [duplicate]函数重载和读取 fdump-tree-all 输出
【发布时间】:2015-07-31 14:48:32
【问题描述】:

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

#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

我查看了 gimple 的输出,发现以下内容:

**

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

**

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

【问题讨论】:

标签: c++ overload-resolution


【解决方案1】:

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

#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;
}

【讨论】:

    猜你喜欢
    • 2011-02-10
    • 1970-01-01
    • 2012-02-24
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2018-02-11
    • 2015-04-26
    相关资源
    最近更新 更多