为什么使用 using 声明编译?

NoS*_*tAl 9 c++ language-lawyer c++20

下面的代码编译所有3级主要的编译器没有任何问题(MSVC与接受的无效类似的代码中的错误,但这是无关的我的问题):

#include <iostream>

namespace Z{
    struct Na{
        struct Batman{
            int x=47;
        };
    };
}

int main(){
   using Na = Z::Na;
   return Na::Na::Na::Na::Na::Na::Na::Batman{}.x;
}
Run Code Online (Sandbox Code Playgroud)

这背后是否有任何逻辑,或者它只是一个奇怪的边缘情况,在应用为“正常”用途制定的规则时最终是合法的?

如果我的困惑不清楚:我希望奇怪的行被解析为

  • 许多嵌套的命名空间,例如std::std::std和被拒绝
  • 对构造函数 ( Na::Na)的引用,然后在::Na遇到以下情况时被拒绝