3.4.1不合格的名称查找和函数重载

时间:2014-05-10 06:06:48

标签: c++ function scope overloading

我读过关于不合格的名字查找,我对功能重载有一个误解。在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");
}

为什么程序在找到名称后继续搜索被调用函数的最佳重载。

1 个答案:

答案 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
        }
    }
}