overload_resolution — 오버로드 해석
overload_resolution — 오버로드 해석 (Overload resolution)
**오버로드 해석(overload resolution)**은 함수 호출을 컴파일할 때 컴파일러가 어떤 오버로드를 호출할지 결정하는 과정이에요.
함수 호출을 컴파일하려면 먼저 **이름 조회(name lookup)**를 수행해야 해요. 함수에서는 인자 의존 조회(ADL)를 포함할 수 있고, 함수 템플릿에서는 템플릿 인자 추론(template argument deduction)이 뒤따를 수 있어요.
출처: cppreference
본문
이름이 둘 이상의 개체를 가리키면 그 이름은 **오버로드(overloaded)**되었다고 해요. 컴파일러는 어느 오버로드를 호출할지 정해야 해요. 간단히 말해, 매개변수가 인자와 가장 잘 맞는 오버로드가 호출돼요.
구체적으로 오버로드 해석은 다음 단계로 진행돼요.
- **후보 함수 집합(candidate functions)**을 구성한다.
- 후보 집합을 **유효 함수(viable functions)**로 줄인다.
- 후보 집합을 분석해 가장 좋은 유효 함수(best viable function) 하나를 정한다 (암묵적 변환 시퀀스의 순위를 포함).
void f(int);
void f(double);
void f(const char*);
f(42); // f(int) — 정확히 일치
f(3.14); // f(double) — 정확히 일치
f("hi"); // f(const char*) — 정확히 일치
f('c'); // char → int 승격으로 f(int) 선택
오버로드 해석은 다음을 판단해요.
- 각 후보에 대해 인자들이 매개변수와 얼마나 잘 맞는지 (정확 일치, 승격, 표준 변환, 사용자 정의 변환 순서)
- 여러 후보 중 가장 좋은 매치를 선택
- 매치가 없거나 모호하면 컴파일 오류
void g(int);
void g(long);
g(1); // int → int 정확 일치 → g(int)
// 모호한 예:
void h(int);
void h(long);
// h(1L)은 g(long)에 일치
오버로드 해석을 이해하면 "왜 내가 원하는 함수가 아니라 다른 함수가 호출되지?" 같은 문제를 해결할 수 있어요. 특히 템플릿 함수, 인자 의존 조회(ADL), 기본 인자, va_list와 함께 쓰일 때 복잡해져요.
다음 요소들이 오버로드 해석에 영향을 줘요.
- 매칭 순위: 정확 일치 > 승격 > 표준 변환 > 사용자 정의 변환
- 모호성(ambiguity): 두 후보의 매치 정도가 같으면 오류
- 후보 함수들에 대한 접근 지정, 기본 인자, 템플릿 추론 결과
모호한 오버로드는 컴파일 오류가 되므로, 필요한 오버로드를 명확히 선택하려면 명시적 캐스트나 템플릿 인자를 쓸 수 있어요.