在名称空间中搜索名称时是否有任何顺序

Is there any order when searching names in namespaces?

本文关键字:任何 顺序 是否 搜索 空间      更新时间:2023-10-16

希望我不是在问一个愚蠢的问题。我确实在谷歌上搜索过,但没有找到太多信息。

我有以下简单的代码,引用自Herb Sutter的exception c++ Book Item 31:

namespace NS
{
    class T{};
    void f(T);
}
void f(NS::T);
int main()
{
    NS::T params;
    f(params);
}

当我编译它时:

prog.cpp: In function ' int main() ':
prog.cpp:12:13:错误:调用重载的' f(NS::T&) '是不明确的
Prog.cpp:12:13:注:候选人是:
prog.cpp:8:6: note: void f(NS::T)
prog.cpp:4:10: note: void NS::f(NS::T)

我理解这是因为f的参数依赖查找。编译器发现两个版本的f,一个在global命名空间,一个在NS命名空间。

我的问题是:
  1. 在多个名称空间中搜索名称时是否有任何顺序?

  2. 它应该总是搜索封闭命名空间,然后全局命名空间?

  3. 如果是这样的话,如果我们已经在NS命名空间中找到了匹配,为什么仍然存在歧义?

如果我的问题不清楚,请随时纠正我。

谢谢。

3.4.2.3 [basic.lookup。]argdep]似乎暗示ADL将在通常的非限定名称查找过程之后执行。

关于非限定名称查找的部分表明名称解析从最窄的范围开始并向外移动。

[ Example:
class B { };
namespace M {
   namespace N {
      class X : public B {
         void f();
      };
   }
}
void M::N::X::f() {
   i = 16;
}
// The following scopes are searched for a declaration of i:
// 1) outermost block scope of M::N::X::f, before the use of i
// 2) scope of class M::N::X
// 3) scope of M::N::X’s base class B
// 4) scope of namespace M::N
// 5) scope of namespace M
// 6) global scope, before the definition of M::N::X::f
—end example ]