函数重载和读取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
我查看了简单的输出,发现如下:
* *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;
}
相关文章:
- 方法错误"not all control paths return a value"和方法不返回值
- 生成文件:6:目标'all'的配方在 Ubuntu-16.04 上失败
- 使用 boost::p roperty_tree::p tree 如何获取特定键的值
- 每次都会重建多个程序的制作文件,尽管配方"all"被标记为虚假
- 制造:对'all'错误无能为力
- 为什么Eigen不能解析内置符号?(all、last、seq等)
- 警告"C++ requires a type specifier for all declaration"地图
- gcc -O2 比 gcc -O2 -g 小,后跟 strip --strip-all
- 为什么 fdump-class-hierarchy 为虚函数提供了两个指针 int vtable
- 警告:"Not all control paths return a value" c++
- AVX2浮子比较并获得0.0或1.0,而不是all-0或全零件
- 链接时,"grab what you need" 和 "grab all" 之间是否有某些内容(-wl,--whole-archive)?
- 在C++中向枚举添加"all"选项的好设计是什么?
- 级运算符 ( "C++ requires a type specifier for all declarations" )
- Boost R-Tree中的最小边界矩形计算
- gradle see output for model.components.binaries.all
- "uses of target_link_libraries must be either all-keyword or all-plain"
- SFINAE 功能的"catch-all"?
- 无法从 gcc 的 -fdump-tree-gimple 中找出 /[ex] 运算符
- 函数重载和读取fdump-tree-all输出