如何在函数重载解析中转储候选?

时间:2010-09-20 10:49:23

标签: c++ c++11 overload-resolution

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

我知道g ++提供option to dump class hierarchy。 (事实上​​,Visual Studio 2010提供了类似的选项,但它没有文档。我记得读过一些关于它的东西 - 可能在VC ++团队博客中 - 但我记不起来了。)

最近,我一直在阅读关于C ++ 0x草案中的重载解析,这真让我感到尴尬。

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

注意:重载决策场景中的候选函数与编译器错误中的候选函数不同。超载解决方案中的候选/可行/最佳可行功能具有其自身的含义。我知道他们在重载决策中有三个阶段:找到候选函数;找到可行的功能; 找到最好的可行功能。通常,最好的可行功能只是一个候选者;否则,电话是不明确的。每个阶段都有自己的规则。

3 个答案:

答案 0 :(得分: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: In function ‘int main()’:
prog.cpp:10: error: call of overloaded ‘f(double)’ is ambiguous 
prog.cpp:4: note: candidates are: void f(int)
prog.cpp:5: note:                 void f(char) 
prog.cpp:2: note:                 void A::f(int)

答案 1 :(得分:2)

转储已经考虑过的所有函数的一种方法是使用一个特定的函数名,其中包含一组与任何东西都不匹配的参数:

struct DumpThemAll {};

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

这将(通常)转储被认为是重载解析的所有operator<<。对于这个特殊的例子,它可能变得毛茸茸。

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

但是我想补充一点,即使可能只有少数几个人可以引用超负荷规则,或者甚至可以理解它,一般来说它并不妨碍你工作,对于标准试图解决每个可能的情况,而你只使用其中几个。

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

答案 2 :(得分:1)

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