Overload Resolution
오버로딩 분석
- 어떤 함수 호출에 대하여, 여러 함수 중(함수 오버로딩으로 인한) 어느것을 사용할 것인지에 대한 C++의 전략이다.
- 전 분석 과정에서, Function Signature만을 고려하며, 함수의 리턴형은 고려대상이 아니다.
Resolution Process (분석 과정)
Phase 1. 후보함수 목록 작성
-호출된 함수와 이름이 동일한 함수와 함수 템플릿들 모아서 후보함수 목록을 만든다.
Phase 2. Function Signature를 통한 필터링
- 매개변수후보함수들 중, 매개변수의 개수가 일치하는 함수들을 찾아서 추린다.
- Argument(실제 매개변수)의 각 데이터형이 Parameter(형식 매개변수)의 데이터형과 정확히 일치하는 경우도 여기에 포함되며, 그렇지 않을 경우, 이들에 대한 암시적 변환 절차*가 이루어진다.
* Conversion Priority (변환 우선순위)
1st. 매개변수가 정확히 대응되는 경우로, 일반 함수가 템플릿 함수보다 우선순위가 높다.
2nd. Promotion Conversion(승급 변환) ; (\(\texttt{char, short} \to \texttt{int}\)) , (\(\texttt{float} \to \texttt{double}\))
3rd. Standard conversion(표준 변환) ; (\(\texttt{int} \to \texttt{char}\)) , (\(\texttt{long} \to \texttt{double}\))
4th. 클래스 선언에서 정의되는 변환과 같은 사용자 정의 변환
Phase 3. 최종 선택
- 추려진 함수들 중 가장 적절한 함수가 있는지 판단하고, 그런 함수가 없을 경우 에러로 간주한다.
- "가장 특수화된" 이라는 표현은 명시적 특수화를 의미하는 것만이 아니라, 데이터형의 변환이 거의 일어나지 않는 경우를 지칭하는 표현이다.
Trivial Conversion (사소한 변환)
- Parameter(형식 매개변수)와 Argument(실제 매개변수) 사이의 미세한 차이로 인해 컴파일 에러가 발생하는 것을 방지하기 위한 개념이다.
From an actual Argument | To a formal Argument |
\(\texttt{Type}\) | \(\texttt{Type &}\) |
\(\texttt{Type &}\) | \(\texttt{Type}\) |
\(\texttt{Type []}\) | \(\texttt{* Type}\) |
\(\texttt{Type (argumentList}\) | \(\texttt{Type (*) (arguementList}\) |
\(\texttt{Type}\) | \(\texttt{const Type}\) |
\(\texttt{Type}\) | \(\texttt{volatile Type}\) |
\(\texttt{Type *}\) | \(\texttt{const Type *}\) |
\(\texttt{Type *}\) | \(\texttt{volatile Type *}\) |
* \(\texttt{Type}\)은 임의의 데이터형을 의미한다.