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; // 한정 조회를 통한 열거자
한정 이름 조회를 정확히 이해하면, 이름이 가려지는 상황에서도 원하는 선언을 정확히 지정할 수 있어요. 특히 큰 코드베이스에서 충돌을 피하는 데 유용해요.