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의 동작을 정확히 예측할 수 있어요.