qualified_lookup — 한정 이름 조회

qualified_lookup — 한정 이름 조회 (Qualified name lookup)

**한정 이름(qualified name)**은 범위 결정 연산자 ::의 오른쪽에 나타나는 이름이에요 (한정 식별자 참조).

한정 이름은 다음을 가리킬 수 있어요.

  • 클래스 멤버 (정적/비정적 함수, 타입, 템플릿 등)
  • 네임스페이스 멤버 (다른 네임스페이스 포함)
  • 열거자(enumerator)

출처: cppreference

본문

::의 왼쪽에 아무것도 없으면, 조회는 전역 네임스페이스 범위의 선언만 고려해요. 이렇게 하면 지역 선언에 가려졌어도 그 이름을 참조할 수 있어요.

int x = 10;          // 전역 x

int main() {
    int x = 20;      // 지역 x가 전역 x를 가림
    std::cout << x;      // 20 (지역)
    std::cout << ::x;    // 10 (전역 — ::로 접근)
}

::의 오른쪽 이름을 조회하려면, 먼저 ::왼쪽 이름에 대한 조회를 완료해야 해요 (decltype 표현식이나 왼쪽이 없는 경우 제외). 이 조회는 왼쪽이 클래스 이름인지 네임스페이스 이름인지에 따라 한정되거나 비한정될 수 있어요.

namespace A {
    struct B {
        static int value;
    };
}
int A::B::value = 42;   // A, B, value 모두 한정 조회

// 클래스 멤버 접근
A::B b;
b.value;

한정 이름 조회는 다음과 같이 쓰여요.

  • 전역 이름 명확화::name으로 지역 변수에 가리더라도 전역에 접근
  • 네임스페이스 멤버std::vector, my_ns::func
  • 클래스 멤버A::value, Base::method (정적 멤버, 열거자 포함)
  • 중첩A::B::C::value처럼 여러 단계
namespace outer { namespace inner {
    struct S { enum { Red, Green }; };
}}
int color = outer::inner::S::Red;   // 한정 조회를 통한 열거자

한정 이름 조회를 정확히 이해하면, 이름이 가려지는 상황에서도 원하는 선언을 정확히 지정할 수 있어요. 특히 큰 코드베이스에서 충돌을 피하는 데 유용해요.

더 알아보기 (Learn more)

cppreference