이름 룩업

이름 룩업 (Name lookup)

이름 룩업(name lookup) 은 프로그램 안에서 어떤 이름을 만났을 때, 그 이름을 도입한 선언(declaration)과 연결해 주는 절차예요.

출처: cppreference

예를 들어 std::cout << std::endl;을 컴파일하려면 컴파일러는 다음을 수행해요.

  • 이름 std에 대한 비한정 이름 룩업(unqualified name lookup)<iostream> 헤더의 namespace std 선언을 찾아요.
  • 이름 cout에 대한 한정 이름 룩업(qualified name lookup)namespace std 안의 변수 선언을 찾아요.
  • 이름 endl에 대한 한정 이름 룩업 — namespace std 안의 함수 템플릿 선언을 찾아요.
  • 이름 operator<<에 대한 인자 종속 룩업(argument-dependent lookup)namespace std 안의 여러 함수 템플릿 선언을 찾아요. 그리고 동시에 std::ostream::operator<<에 대한 한정 이름 룩업 — class std::ostream 안의 여러 멤버 함수 선언을 찾아요.

본문

룩업이 하는 일

함수와 함수 템플릿 이름에 대해 이름 룩업은 같은 이름에 여러 선언을 연결할 수 있고, 인자 종속 룩업으로 추가 선언을 얻을 수 있어요. 템플릿 인자 추론(template argument deduction)도 적용될 수 있고, 그 선언 집합은 어떤 선언을 사용할지 고르는 오버로드 결정(overload resolution) 으로 넘겨져요. 멤버 접근 규칙은 해당된다면 이름 룩업과 오버로드 결정이 끝난 뒤에만 고려돼요.

그 외 모든 이름(변수, 네임스페이스, 클래스 등)에 대해 이름 룩업은 같은 개체를 선언하는 경우에만 여러 선언을 연결할 수 있어요. 그렇지 않으면 프로그램이 컴파일되려면 단일 선언을 만들어 내야 해요. 어떤 범위 안에서 이름을 룩업하면 그 이름의 모든 선언을 찾는데, "struct hack" 또는 "type/non-type hiding" 으로 알려진 한 가지 예외가 있어요. 같은 범위 안에서 어떤 이름의 일부 발생은 typedef 가 아닌 클래스/구조체/union/열거의 선언을 가리킬 수 있는 반면, 같은 이름의 다른 모든 발생은 전부 같은 변수·비정적 데이터 멤버·열거자를 가리키거나, 전부 (오버로드될 수 있는) 함수 또는 함수 템플릿 이름을 가리켜요. 이 경우 오류는 없지만 타입 이름은 룩업에서 숨겨져요 (코드는 그 타입에 접근하려면 정교화된 타입 지정자(elaborated type specifier)를 써야 해요).

룩업의 종류 (Types of lookup)

이름이 범위 결정 연산자 ::의 바로 오른쪽에 나타나거나, :: 뒤에 모호성 해소 키워드 template가 이어진 뒤에 나타나면 한정 이름 룩업(qualified name lookup)을 봐요.

그렇지 않으면 비한정 이름 룩업(unqualified name lookup)을 봐요 (함수 이름의 경우 인자 종속 룩업(argument-dependent lookup)을 포함해요).

결함 보고 (Defect reports)

동작 변경 결함 보고로 주요하게 조정된 내용은 이래요. "struct hack"이 클래스 범위에서도 적용되게 함(CWG 2063), 비함수(템플릿) 이름의 룩업에서 같은 개체를 선언하면 여러 선언을 연결하는 것이 허용됨(CWG 2218) 등이에요.

더 알아보기 (Learn more)