Overload Rules

오버로딩은 매개변수 목록이 구분될 때만 성립한다

컴파일러는 호출문에서 함수 이름과 인자 목록을 보고 후보를 고릅니다. 반환 타입은 오버로드 구분 기준이 아닙니다.

개수 차이 add(a, b) vs add(a, b, c)
타입 차이 int 인자와 double 인자
순서 차이 string, intint, string
가능

매개변수 타입이 다름

add(int, int) / add(double, double)

호출 인자의 타입으로 두 함수를 구별할 수 있습니다.

가능

매개변수 개수가 다름

add(int, int, int)

인자가 세 개인 호출은 두 인자 함수와 겹치지 않습니다.

가능

매개변수 순서가 다름

printValue(std::string, int) / printValue(int, std::string)

같은 타입 조합이라도 순서가 다르면 호출 모양이 달라집니다.

불가

반환 타입만 다름

int add(int, int) / double add(int, int)

호출문 add(1, 2)만으로 반환 타입을 선택할 수 없습니다.

candidate set

같은 이름 add로 모인 후보

정수 int add(int, int)
실수 double add(double, double)
세 인자 int add(int, int, int)
문자열 std::string add(std::string, std::string)
호출: add(5, 7)

정확히 맞는 후보 선택

인자 두 개가 모두 int이므로 int add(int, int)가 정확히 일치합니다.

호출: add(1, 2, 3)

개수로 후보가 좁혀짐

인자가 세 개이므로 두 인자 버전은 후보에서 제외됩니다.

무시됨

반환 타입은 호출 전 단서가 아님

결과를 double 변수에 담더라도 같은 매개변수 목록의 함수를 둘 수는 없습니다.