函数重载和读取 fdump-tree-all 输出
function overloading and reading fdump-tree-all output
我正在调查下面列出的函数重载问题,发现以下代码无法编译。
#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参数。如果是这样,为什么编译会失败,为什么我们不能用相同的签名重载静态函数。
如果静态函数和非静态函数都采用同一组参数,那么在调用 class(非静态)方法时,程序员将无法区分想要调用静态或非静态函数。示例:
#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;
}
我正在调查下面列出的函数重载问题,发现以下代码无法编译。
#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参数。如果是这样,为什么编译会失败,为什么我们不能用相同的签名重载静态函数。
如果静态函数和非静态函数都采用同一组参数,那么在调用 class(非静态)方法时,程序员将无法区分想要调用静态或非静态函数。示例:
#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;
}