5

如何转储函数调用的候选函数(或可行函数或最佳可行函数)?

我知道 g++ 提供了转储类层次结构的选项。(事实上​​,Visual Studio 2010 提供了一个类似的选项,但它没有记录。我记得读过一些关于它的东西——可能在 VC++ 团队博客中——但我记不太清楚了。)

最近一直在看C++0x草稿中关于重载解析的内容,着实让我尴尬。

是否有任何编译器提供转储候选函数、可行函数或最佳可行函数的选项?

注意:重载解析场景中的候选函数与编译器错误中的候选函数不同。重载解决方案中的候选/可行/最佳可行函数有其自身的含义。我知道它们是重载解决的三个阶段:找到候选函数;找到可行的功能;找到最佳可行的功能。通常,最好的可行函数只是一个候选函数;否则,调用是模棱两可的。每个阶段都有自己的规则。

4

3 回答 3

2

转储所有已考虑的函数的一种方法是使用具有一组不匹配任何参数的特定函数名称:

struct DumpThemAll {};

int main(int argc, char* argv[])
{
  std::cout << DumpThemAll() << std::endl;
}

这将(通常)转储所有operator<<被考虑用于重载解决方案。对于这个特定的示例,它可能会变得多毛。

如果你只想转储一些特定的功能,那就更难了。做到这一点的唯一方法是人为地创建一个模棱两可的调用,但是只有当您提供的虚假函数与最佳匹配具有完全相同的“分数”时,调用才是模棱两可的......所以很难设计一个这样的函数你不明白这个评分是如何工作的(就我个人而言,我不明白这一切......规则太多......)

但是我要补充一点,即使可能只有少数人可以从头顶引用超载规则,或者甚至可以理解它,但通常它不会阻止你工作,因为标准尝试解决所有可能的情况,而您只使用其中的几个。

此外,滥用函数/运算符重载会使您的程序不可读,因为它对人类来说是神秘的(特别是因为受当前翻译单元中包含的特定文件的影响)。

于 2010-09-20T11:48:58.853 回答
2

在 Visual Studio 中执行此操作的最简单方法是编译不明确的调用。编译器将使用可用候选者列表吐出错误。可能 g++ 也会这样做。

于 2010-09-20T11:03:19.877 回答
2

我不认为有任何直接的方法。

一种方法是故意人为地制造冲突/歧义。大多数编译器会发出以下形式的错误,并喷出考虑的候选者列表。

namespace A {
    void f(int x) {}
}
void f(int x) {}
void f(char x) {}

using namespace A;

int main(){
    f(2.2);
}

G++ 错误信息:

prog.cpp:在函数'int main()'中:
prog.cpp:10: 错误: 重载 'f(double)' 的调用不明确
prog.cpp:4:注意:候选人是:void f(int)
prog.cpp:5: 注意: void f(char)
prog.cpp:2: 注意: void A::f(int)
于 2010-09-20T11:06:10.450 回答