2016-08-01 189 views
1

根据unqualified lookup in cppreference.com函数名无法找到

对于在函数的定义中使用的名称,或者在其主体或作为默认参数的一部分,其中,所述功能是一个成员用户声明或全局名称空间的名称,在使用名称之前搜索使用名称的块,然后在块的开始之前搜索封闭块等,直到到达作为函数体的块为止。在然后在函数声明中搜索,直到使用的名称,然后封闭命名空间的函数的定义(不一定是声明),命名空间等

因此,我认为函数名定义全局命名空间范围应该简单地通过未查询的查找来找到。然而,下面的代码段编译失败:

#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)和锵(3.8.0)报告相同error

然后,或者我删除using std::begin语句或将class AAA移动到namespace AA,上述程序将成功编译。所以我认为一旦通过名称查找发现我的begin,它将通过重载解析来选择。因此,问题是:为什么我的begin函数在全局范围内声明和定义,在上面的代码案例中找不到?

+0

请编辑您的问题以包含错误消息。 – 2016-08-01 02:57:49

回答

1

请注意,unqualified name lookup将停止,如果名称被找到(在某个范围),那么其他范围将不会被搜索。对于您的示例代码,将在功能范围main()(指std::begin)处找到名称begin,然后名称查找停止,因此将不会检查全局范围中的名称。

...,名称查找检查范围如下所述,直到找到至少一个任何类型的声明,此时查找停止并且没有其他范围被检查。

从您发布的报价(重点由我加的):

等,直到到达那就是函数体块。 (名称查找会在这里停止,即在main()函数体的块)

则namespace ...... (进一步命名空间将不会被搜索到。)