我读过关于不合格的名字查找,我对功能重载有一个误解。在N3797中说:
在3.4.1中列出的所有情况下,搜索范围为a 按各自类别列出的顺序进行声明; 一旦找到名称的声明,名称查找就会结束。
请考虑以下代码段:
#include <stdio.h>
void foo(int)
{
printf("foo(int)\n");
}
void foo()
{
printf("foo(void)\n");
}
int main()
{
foo();
}
这个程序显然打印了foo(void)
。在这种情况下,将在范围中搜索名称foo
以查找声明。让第一个成立foo的捍卫者
void foo(int)
{
printf("foo(int)\n");
}
为什么程序在找到名称后继续搜索被调用函数的最佳重载。
答案 0 :(得分:0)
来自标准:
Name lookup may associate more than one declaration with a name if
it finds the name to be a function name. Overload resolution (13.3) takes
place after name lookup has succeeded.
首先,对可能的候选者进行整理,然后使用最合适的重载。
名称查找在名称找到声明后立即结束,并不意味着在找到第一个声明时返回。它累积匹配范围中的所有名称,然后使用最合适的名称。在方法的情况下,如果它们都不能使用,那么它将给出错误,而不是在任何封闭的范围中搜索。请考虑以下代码:
namespace A
{
void f(double x){cout<<"A::f(double)\n";}
void f(string s){cout<<"A::f(string)\n";}
namespace B
{
void f(int x){cout<<"B::f\n";}
void call()
{
f(10); // calls B::f
f(10.5); // calls B::f even if better matching method is present in A
f("Hi"); // error, does not search in A
}
}
}