请考虑以下代码:
#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
}
这意味着封闭命名空间不考虑。我想知道它在哪里指定。
答案 0 :(得分:5)
在这种情况下,将首先找到void foo();的定义。但是不合格的名称查找并没有结束。为什么?
因为标准说:
如果名称查找的名称是函数名称,则名称查找可以将多个声明与名称相关联;据说声明形成一组重载函数(13.1)。在名称查找成功后发生重载分辨率(13.3)。
因此,在功能的情况下,名称查找在找到第一个匹配后不会结束,它会收集所有名称,然后重载决策发生。
<强>更新强>
对于更新后的问题,您将返回previous question
一旦找到名称的声明,名称查找就会结束。
因此,只要在内部范围中找到foo
,就不会再进行搜索。
但是如果您使用名称空间限定的名称,那么将搜索指定的名称空间:
int a = ::foo(5); // finds foo in global namespace.
所以一般来说,对于非限定搜索,首先在当前范围内进行搜索,如果没有找到,则在下一个封闭范围内进行搜索等等。但是,一旦找到名称,搜索结束,名称是否可用无关紧要。这意味着,对于函数,它可能不是正确的,可能是在封闭范围内存在重载的,这是正确的,但搜索不会继续。