이름 검색
이름 검색(name lookup)은 프로그램에서 이름(name)을 만났을 때, 이를 소개한 선언(declaration)과 연관 짓는 절차입니다.
예를 들어 컴파일러는 std::cout << std::endl;를 컴파일하기 위해 다음을 수행합니다.
- 이름
std에 대한 한정되지 않은(unqualified) 이름 검색을 수행하여 헤더<iostream>에서 네임스페이스 std의 선언을 찾습니다. - 이름
count에 대한 한정된(qualified) 이름 검색을 수행하여 네임스페이스std에서 변수 선언을 찾습니다. - 이름
endl에 대한 한정된(qualified) 이름 검색을 수행하여 네임스페이스std에서 함수 템플릿 선언을 찾습니다. - 이름
operator <<에 대한 인자 의존 검색(argument-dependent lookup)을 수행하여 네임스페이스 std에서 다수의 함수 템플릿 선언을 찾을 뿐 아니라 이름std::ostream::operator<<에 대한 한정된 이름 검색을 수행하여 클래스std::ostream에서 다수의 멤버 함수 선언도 찾습니다.
함수와 함수 템플릿 이름에 대하여, 이름 검색은 동일한 이름을 가지는 여러 선언과 연관 지을 수도 있습니다. 그리고 인자 의존 검색(argument-dependent lookup)으로부터 추가적인 선언을 획득할지도 모릅니다. 템플릿 인자 추론(Template argument deduction) 역시 적용될수도 있으며, 일련의 선언들이 오버로드 해결(overload resolution)로 전달되어 사용될 선언이 선택됩니다. 필요하다면 멤버 접근 규칙은 이름 검색과 오버로드 해결 이후에만 고려됩니다.
다른 모든 이름들(변수, 네임스페이스, 클래스, 기타)에 대하여 이름 검색은 꼭 하나의 적합한 선언만 제시하여 프로그램이 컴파일 될 수 있도록 합니다. 범위내에서 이름을 검색하는 것은 "struct hack" 또는 "type/non-type hiding"이라고 알려진 한가지 예외를 제외하고는 그 이름을 가지는 모든 선언을 찾습니다. 동일한 범위에서 일부 이름의 출현은 typedef 되지 않은 class/struct/union/enum의 선언을 가리킬수도 있는 반면 동일한 이름의 다른 모든 출현이 같은 변수나 비정적 데이터 멤버 (since C++14), 열거자를 가리키거나 또는 아마 오버로딩된 함수 또는 함수 템플릿 이름을 가리킵니다. 이 경우 에러는 발생하지 않지만, 타입 이름은 검색으로부터 숨겨집니다(타입 이름에 접근하기 위해서는 정교한 타입 지정(elaborated type specifier)을 사용하여야만 합니다.).
검색의 유형
만약 이름이 범위 지정 연산자:: 오른쪽에 즉시 나타나거나, 명확한 키워드 template이 뒤따르는 ::이후에 나타날 경우 다음을 봅니다.
그렇지 않을 경우 다음을 봅니다.
- (함수 이름의 경우 인자 의존 검색 포함)
참고
C documentation for Lookup and name spaces
|