根据unqualified lookup in cppreference.com:
因此,我认为在全局 namespace 范围中定义的函数名称应仅通过不合理的查找来找到。但是,以下代码无法编译:
#include <iterator>
#include <iostream>
namespace AA{
class AAA{};
};
using namespace AA;
int begin(AAA ){
return 3;
}
int main(){
using std::begin; // to add std::begin in the name candidate set
auto x = AAA();
return begin(x); // compile error, ::begin cannot be found
}
GCC(6.1.1)和Clang(3.8.0)都报告了相同的error。
并且,我删除了
using std::begin
语句或将class AAA
移至namespace AA
,以上程序均成功编译。因此,我认为一旦通过名称查找找到了自己的begin
,就会通过重载解析来选择它。因此,问题是:为什么在上述代码案例中根本找不到在全局范围中声明和定义的begin
函数? 最佳答案
请注意,如果找到该名称(在某个范围内),unqualified name lookup将停止,然后将不再搜索其他范围。对于您的示例代码,名称begin
将在main()
的功能范围内找到(即std::begin
),然后名称查找停止,因此不会检查全局范围内的名称。
从您发布的报价中(我加强调):
关于c++ - 找不到全局 namespace 范围中的函数名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38690369/