St.*_*rio 5 c++ function language-lawyer
请考虑以下代码:
#include <iostream>
int a=5;//1
extern int a;//2
int main(){ cout << a; }
Run Code Online (Sandbox Code Playgroud)
在非限定名称查找声明期间,将找到#1,并且在找到#1之后,非限定名称查找结束.
但考虑另一个例子:
#include <iostream>
void foo() { cout << "zero arg"; }
void foo(int a) { cout << "one arg"; }
int main(){ foo(4); }
Run Code Online (Sandbox Code Playgroud)
在那种情况下,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
}
Run Code Online (Sandbox Code Playgroud)
这意味着封闭命名空间不考虑.我想知道它在哪里指定.
在那种情况下,首先会找到void foo();的定义.但是不合格的名称查找并没有结束.为什么?
因为标准说:
如果名称查找名称是函数名称,则名称查找可以将多个声明与名称相关联; 据说声明形成一组重载函数(13.1).名称查找成功后,将发生重载分辨率(13.3).
因此,在函数的情况下,名称查找不会在找到第一个匹配后结束,它会收集所有名称,然后发生重载解析.
更新
对于更新的问题,您将回到上一个问题
一旦找到名称的声明,名称查找就会结束.
因此,只要foo在内部范围内找到,就不再进行进一步搜索.
但是,如果使用名称空间限定名称,则将搜索指定的名称空间:
int a = ::foo(5); // finds foo in global namespace.
Run Code Online (Sandbox Code Playgroud)
所以一般来说,对于不合格的搜索,首先在当前范围内进行搜索,如果没有找到,则在下一个封闭范围内进行搜索等等.但是,一旦找到名称,搜索结束,名称是否可用无关紧要.这意味着,对于函数,它可能不是正确的,可能是在封闭范围中存在重载的正确,但搜索不会继续.