Глава 15. Перегрузка функций 375
со значением о. Так вот это вам не удастся: никогда для аргумента со значением о не будет вызвана версия Foo, принимающая char*.
Функции, отличающиеся только операцией получения адреса, тоже не могут быть перегружены. Например функции
int Foo ( int &r) ;
int Foo ( int r) ;
недостаточно различны для перегрузки.
Также не могут быть перегружены функции-члены, отличающиеся только тем, что одна из их статическая, а другая нет:
class X
{
public:
static void F (); // ошибка: не перегружаема void F (); // ошибка: не перегружаема ,
};
Нельзя перегружать функции, отличающиеся только типом возвращаемого значения, то есть функции
void Lulu (); /'/ ошибка: перегрузка не производится int Lulu(); // по возвращаемому типу
Возвращаемый тип может изменяться как угодно, но возможность перегрузки определяется только именем функции, числом и типом аргументов.
Далее ...
Перегрузка функций — это практичное решение реальных проблем. Компоновщик, разрешая вызовы функций, ищет имена в таблице символов; чтобы при этом не возникало конфликта имен, имена должны быть уникальными. Это в C++ осталось неизменным. Технический прием, позволяющий компилятору создавать уникальные имена на основе имени функции и типов ее аргументов, называется уточнением имен (name mangling).
Уточнение имен путем использования первых букв названия типа гарантирует, что имена будут уникальны и вызовы функций разрешимы. Перегрузка функций — это изыск, но это и необходимость. Без перегрузки функций были бы немыслимы множественные конструкторы и оператор-функции.
Перегрузка функций снимает бремя изобретения различных имен для похожих функций, позволяет определить несколько конструкторов в классе и поддерживает перегрузку операций.