通常不合格的函数名称查找是否与查找变量名称不同?

时间:2014-05-31 05:36:43

标签: c++ function language-lawyer

请考虑以下代码:

#include <iostream>

int a=5;//1
extern int a;//2

int main(){ cout << a; }

在非限定名称查找声明期间,将找到#1,并且在找到#1之后,非限定名称查找结束。

但请考虑另一个例子:

#include <iostream>

void foo() { cout << "zero arg"; }
void foo(int a) { cout << "one arg"; }

int main(){ foo(4); }

在这种情况下,首先会找到void foo();的定义。但是不合格的名称查找并没有结束。为什么? 标准中指定的位置?一般来说,我对以下内容感兴趣:

函数调用的postfix-expression何时结束非限定名称查找?

注意:我知道ADL是什么意思。在这种情况下,ADL生成的声明集是空的。

UPD:

但如果我们写下以下内容:

int foo(int a) { return 0; }
namespace A
{
    int foo() { return 1; }
    int a= foo(5); //Error: to many arguments
}

这意味着封闭命名空间不考虑。我想知道它在哪里指定。

1 个答案:

答案 0 :(得分:5)

  

在这种情况下,将首先找到void foo();的定义。但是不合格的名称查找并没有结束。为什么?

因为标准说:

  

如果名称查找的名称是函数名称,则名称查找可以将多个声明与名称相关联;据说声明形成一组重载函数(13.1)。在名称查找成功后发生重载分辨率(13.3)。

因此,在功能的情况下,名称查找在找到第一个匹配后不会结束,它会收集所有名称,然后重载决策发生。

<强>更新

对于更新后的问题,您将返回previous question

  一旦找到名称的声明,

名称查找就会结束。

因此,只要在内部范围中找到foo,就不会再进行搜索。

但是如果您使用名称空间限定的名称,那么将搜索指定的名称空间:

int a = ::foo(5); // finds foo in global namespace.

所以一般来说,对于非限定搜索,首先在当前范围内进行搜索,如果没有找到,则在下一个封闭范围内进行搜索等等。但是,一旦找到名称,搜索结束,名称是否可用无关紧要。这意味着,对于函数,它可能不是正确的,可能是在封闭范围内存在重载的,这是正确的,但搜索不会继续。