Overload

함수 오버로딩 계약

오버로드는 인자 타입과 개수로 후보를 고른다. 편리함보다 어떤 호출이 어느 함수로 가는지 예측 가능해야 한다.

01

후보 집합 축소

비슷한 의미의 overload가 너무 많으면 호출자와 컴파일러 모두 선택이 어려워진다.

02

암시 변환을 막는다

한 인자 생성자와 기본 매개변수가 예상치 못한 후보를 만들 수 있다.

03

의미 차이를 이름으로 구분

타입만 다르고 의미가 크게 다르면 overload보다 다른 함수 이름이 낫다.

exact
정확한 타입 일치 가장 강한 후보로 선택된다.
const와 reference도 영향을 준다.
promotion
작은 정수 승격 char, short가 int로 바뀌는 식의 변환이다.
부호를 확인한다.
conversion
일반 변환 double에서 int, derived에서 base 같은 변환은 순위가 낮다.
정보 손실이 있을 수 있다.
template
후보 경쟁 템플릿과 비템플릿 overload가 함께 있으면 선택 규칙이 더 복잡해진다.
테스트 호출을 남긴다.

모호성 · 의미 · explicit 점검

모호성 0, nullptr, 문자열 리터럴처럼 여러 타입으로 변환 가능한 인자를 테스트했는가.
의미 같은 이름의 함수들이 같은 동작 개념을 공유하는가.
explicit 오버로드 후보에 끼면 안 되는 생성자가 암시 변환을 허용하지 않는가.

nullptr overload

void open(const char* path);
void open(std::filesystem::path path);

open(nullptr); // 어떤 계약인지 의도적으로 막거나 분리한다.