더북(TheBook)

여기에서는 intfloat 매개변수를 사용해 divide 함수를 두 번 정의했다. divide 함수를 호출하면 컴파일러는 오버로드 확인(Overload Resolution)을 수행한다.

1. 인수 타입과 정확히 일치하는 오버로드가 있는가? 있다면 해당 오버로드를 취한다.
그렇지 않다면,

2. 변환 후 일치하는 오버로드가 있는가? 얼마나 있는가?

0: 오류, 일치하는 함수를 찾을 수 없다.

1: 해당 오버로드를 취한다.

> 1: 오류, 모호한 호출

오버로드 확인이 우리 예제에 어떻게 적용되는지 살펴보자. divide(x, y)divide(n, m) 호출은 정확히 일치한다. divide(x, m)의 경우, 정확하게 일치하는 오버로드가 없고 암시적 변환(Implicit Conversion)에 의해 둘 다 오버로드할 수 있기에 모호하다.

"암시적 변환"이라는 용어에는 몇 가지 설명이 필요하다. 우리는 이미 숫자 타입이 서로 변환할 수 있음을 확인했다. 이 변환은 예제에서 볼 수 있듯이 암시적 변환이다. 나중에 사용자 정의 타입을 정의할 때 기존 타입에서 새 타입으로, 반대로 새 타입에서 기존 타입으로의 변환을 구현할 수 있다. 이러한 변환은 explicit으로 선언할 수 있으며 명시적인 변환을 요청했을 경우에만 적용한다. 함수 인수의 타입이 일치하는 경우에도 적용한다.

⇒ C++11/overload_testing.cpp

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.