더 형식적으로 이야기하자면, 함수 오버로드는 시그니처(Signature)가 서로 달라야 한다. C++에서 시그니처는 다음과 같이 구성되어 있다.
• 함수 이름
• 항(Arity)이라고 하는 인자의 개수
• (해당 순서대로) 인자의 타입
반대로 리턴 타입이나 인수 이름만 다른 오버로드는 동일한 시그니처를 가지며, (금지된) 재정의로 간주한다.
void f(int x) { } void f(int y) { } // 재정의: 인수 이름만 다르다. long f(int x) { } // 재정의: 리턴 타입만 다르다.
이름이나 인자의 개수가 다른 함수는 말할 필요도 없이 서로 다른 함수다. 레퍼런스 기호가 있으면 인수 타입이 다른 인수 타입으로 바뀐다(따라서, f(int)와 f(int&)가 공존할 수 있다). 다음 세 오버로드는 서로 다른 시그니처를 갖는다.
void f(int x) { } void f(int& x) { } void f(const int& x) { }