Тип перегрузки из родительского пространства имен - PullRequest
7 голосов
/ 25 февраля 2020

Кажется, что это правильно скомпилировано:

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

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

int main() {
    using namespace A::B;
    S s;
}

Даже если в строке using S = S<int> первое S относится к A::B::S, а второе S относится к шаблону A::S.

Это стандарт C ++?

1 Ответ

7 голосов
/ 25 февраля 2020

Область действия S начинается в точке декларации , а для декларации using - после идентификатора типа, к которому относится псевдоним (S<int>).

Таким образом, внутри декларации область действия нового S еще не началась, а S по-прежнему относится к A::S.

Согласно https://en.cppreference.com/w/cpp/language/scope#Point_of_declaration .

...