unqualified_lookup — 비한정 이름 조회

unqualified_lookup — 비한정 이름 조회 (Unqualified name lookup)

**비한정 이름(unqualified name)**은 범위 결정 연산자 ::의 오른쪽에 나타나지 않는 이름이에요. 비한정 이름 조회는 아래 설명처럼 범위(scope)를 조사해서, 어떤 종류의 선언이라도 하나 이상 찾을 때까지 진행하고, 그 시점에 조회가 멈추고 더 이상 범위를 조사하지 않아요.

출처: cppreference

본문

비한정 이름 조회를 위해, 어떤 문맥의 조회는 일부 선언을 건너뛰는데 예를 들어:

  • :: 왼쪽에 쓰인 이름의 조회는 함수·변수·열거자 선언을 무시해요.
  • 기반 클래스 지정자로 쓰인 이름의 조회는 모든 비타입 선언을 무시해요.

비한정 이름 조회는 가장 안쪽 범위부터 바깥쪽으로 진행돼요.

int x = 10;              // 전역 x

int main() {
    int x = 5;           // 블록 범위 x — 전역 x를 가림
    {
        int x = 1;       // 중첩 블록 x
        std::cout << x;  // 1 (가장 가까운 내부 범위)
    }
    std::cout << x;      // 5 (블록 범위)
}

비한정 이름 조회가 멈추는 규칙이 중요해요. 가장 안쪽 범위에서 선언을 하나라도 찾으면 바깥쪽 범위는 조사하지 않아요. 찾은 선언이 나중에 쓰이기에 부적절해도(예: 함수인데 변수로 쓰기) 이미 조회는 끝난 거예요.

int value = 100;
void f() {}
void g() {
    int value = 1;
    std::cout << value;  // 블록의 value (전역 아님)
    // std::cout << f;   // f는 블록에 없음 → 전역 f 찾음
}

비한정 이름 조회는 **인자 의존 조회(ADL, Argument-Dependent Lookup)**와 함께 작동하기도 해요. ADL은 함수 호출에서 인자의 네임스페이스에 있는 함수도 후보에 추가하는 규칙이에요.

namespace mylib {
    struct Thing {};
    void process(Thing);
}
mylib::Thing t;
process(t);   // ADL로 mylib::process를 찾음

비한정 이름 조회를 이해하면 이름이 가려지는(shadowing) 상황, 전역/지역 이름의 혼동, 그리고 ADL의 동작을 정확히 예측할 수 있어요.

더 알아보기 (Learn more)

cppreference