使命名空间内联时使用 using 指令进行限定名称查找的不同行为

Different behavior for qualified name lookup with using-directive when making namespace inline

我正在学习using-directives,并试图了解using-directives的名称查找规则,但我遇到了这个问题,我找不到任何解释。

问题是这样的:

prog1:命名空间 C 在命名空间 A 之外:

#include <iostream>
namespace C
{
    namespace Detail
    {
        void func()
        {
            std::cout << "C::Detail::func " << "\n";
        }
    }
}

namespace A
{
    namespace Detail
    {
        void func()
        {
            std::cout << "A::Detail::func " << "\n";
        }
    }

    using namespace C;

    void func2()
    {
        Detail::func();  // no conflict, select A::Detail::func
    }
}

int main()
{
    A::func2();
    return 0;
}

程序成功,执行并输出A::Detail::func.

当我在 namespace A 中移动 namespace C 时,出现编译器错误:

prog2: 命名空间 C 在命名空间 A:

namespace A
{
    namespace C
    {
        namespace Detail
        {
            void func()
            {
                std::cout << "C::Detail::func " << "\n";
            }
        }
    }

    namespace Detail
    {
        void func()
        {
            std::cout << "A::Detail::func " << "\n";
        }
    }

    using namespace C;

    void func2()
    {
        Detail::func();    // conflict for A::Detail::func and A::C::Detail::func
    }
}

int main()
{
    A::func2();
    return 0;
}

程序有这个编译器错误:

prog.cc:27:9: error: reference to 'Detail' is ambiguous
        Detail::func();
        ^
prog.cc:15:15: note: candidate found by name lookup is 'A::Detail'
    namespace Detail
              ^
prog.cc:6:19: note: candidate found by name lookup is 'A::C::Detail'
        namespace Detail
                  ^
1 error generated.

编译器:GCC 9.3.0 和 CLANG 9.0.0,结果相同

我的问题:

为什么结果不一样,这种情况下限定名查找的具体规则是什么?

[namespace.udir]/2 A using-directive specifies that the names in the nominated namespace can be used in the scope in which the using-directive appears after the using-directive. During unqualified name lookup (6.4.1), the names appear as if they were declared in the nearest enclosing namespace which contains both the using-directive and the nominated namespace. [ Note: In this context, “contains” means “contains directly or indirectly”. —end note ]

强调我的。在 prog1 中,最近的封闭命名空间是全局命名空间,A::Detail::Detail 之前找到。在 prog2 中,最近的封闭命名空间是 A,因此名称查找找到两个不同的命名空间,都命名为 A::Detail.