Функции не могут отличаться только типами возвращаемого значения. Если списки параметров функций совпадают, а типы возвращаемого значения отличаются, то это будет ошибкой:
Record lookup(const Account&);
bool lookup(const Account&); //
//
Два списка параметров могут быть идентичными, даже если они не выглядят одинаково:
//
Record lookup(const Account &acct);
Record lookup(const Account&); //
typedef Phone Telno;
Record lookup(const Phone&);
Record lookup(const Telno&); //
Первое объявление в первой паре именует свой параметр. Имена параметров предназначены только для документирования. Они не изменяют список параметров.
Во второй паре типы только выглядят разными, Telno
— не новый тип, это только синоним типа Phone
. Псевдоним типа (см. раздел 2.5.1) предоставляет альтернативное имя для уже существующего типа, а не создает новый тип. Поэтому два параметра, отличающиеся только тем, что один использует имя типа, а другой его псевдоним, не являются разными.
Как упоминалось в разделе 6.2.3, спецификатор const
верхнего уровня (см. раздел 2.4.3) никак не влияет на объекты, которые могут быть переданы функции. Параметр, у которого есть спецификатор const
верхнего уровня, неотличим от такового без спецификатора const
верхнего уровня:
Record lookup(Phone);
Record lookup(const Phone); //
Record lookup(Phone*);
Record lookup(Phone* const); //
//
Здесь вторые объявления повторно объявляет ту же функцию, что и первые. С другой стороны, функцию можно перегрузить на основании того, является ли параметр ссылкой (или указателем) на константную или неконстантную версию того же типа; речь идет о спецификаторе const
нижнего уровня:
//
//
Record lookup(Account&); //
Record lookup(const Account&); //
//
Record lookup(Account*); //
//
Record lookup(const Account*); //
//
В этих случаях компилятор может использовать константность аргумента, чтобы различить, какую функцию применять. Поскольку нет преобразования (см. раздел 4.11.2) из константы, можно передать константный объект (или указатель на константу) только версии с константным параметром. Так как преобразование в константу возможно, можно вызвать функцию и неконстантного объекта, и указателя на неконстантный объект. Однако, как будет представлено в разделе 6.6.1, компилятор предпочтет неконстантные версии при передаче неконстантного объекта или указателя на неконстантный объект.