根据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/

10-11 18:02
查看更多