从父命名空间重载类型

tml*_*len 7 c++ namespaces c++11 c++14

这似乎可以正确编译:

namespace A {
    template<typename T>
    struct S {};

    namespace B {
        using S = S<int>;
    }
}

int main() {
    using namespace A::B;
    S s;
}
Run Code Online (Sandbox Code Playgroud)

即使在这一行using S = S<int>,第一个S是指A::B::S,而第二个S是指模板A::S

这是标准的 C++ 吗?

tml*_*len 7

的范围S从它的声明点开始,对于一个using声明,它在别名所指的类型标识 ( S<int>) 之后。

所以在声明里面,new 的作用域S还没有开始,S仍然指向A::S.

根据https://en.cppreference.com/w/cpp/language/scope#Point_of_declaration

  • 相关标准文本为 https://eel.is/c++draft/dcl.dcl#nt:alias-declaration 和 https://eel.is/c++draft/basic.scope.pdecl#3.sentence -3 (3认同)