Соответствие аргументов
Перегруженные функции выбраны для лучшей сопоставления объявлений функции в текущей области к аргументам предоставленным в вызове функции.Если эквивалентную функцию найдена, то эта функция вызывается. "Эквивалентно" в этом контексте означает одно из следующих действий:
Точное соответствие не найдено.
Тривиальное преобразование выполнено.
Объединенный было выполнено продвижение.
Стандартное преобразование к требуемому типу аргумента существует.
Определенное пользователем преобразование (или конструктор) или оператор преобразования к требуемому типу аргумента существует.
Аргументы, представленные многоточием найдены.
Компилятор создает набор функций, выбранного для каждого аргумента.Потенциальные функции функции в которых фактический аргумент в этой позиции может быть преобразовано в тип формального аргумента.
Набор "лучших соответствующих функций" создан для каждого аргумента, а выбранную функцию пересечение всех наборов.Если пересечение содержит более одной функции, перегружены неоднозначен и формирует ошибку.Функция, наконец, всегда выбрана более подходит, чем другая функция в каждой группе по крайней мере одного аргумента.Если это не так, если победитель (clear), то вызов функции выдает ошибку.
Рассмотрим следующие объявления (функции, помечаются Variant 1" Variant 2и Variant 3для идентификации на следующий обсуждении):
Fraction &Add( Fraction &f, long l ); // Variant 1
Fraction &Add( long l, Fraction &f ); // Variant 2
Fraction &Add( Fraction &f, Fraction &f ); // Variant 3
Fraction F1, F2;
Рассмотрим следующую выписку:
F1 = Add( F2, 23 );
Предыдущая выписка создает 2 набора:
Набор 1: Потенциальные функции, которые имеют первый аргумент типа части |
Набор 2: Потенциальные функции аргумент которых второй может быть преобразовано в тип int |
---|---|
Версия 1 |
Версия 1int может быть преобразован в long с помощью стандартного преобразования) |
Версия 3 |
|
Функции в наборе 2 функции, для которых неявные преобразования из фактического параметра типа к формальному типу параметра и среди таких функций функцию, для которой "стоимость" преобразование фактического параметра типа в формальный параметр типа самые мелкие.
Пересечение этих наборов другое 2 1.Примером неоднозначного вызова функции:
F1 = Add( 3, 6 );
Предыдущий вызов функции создает следующие группы:
Набор 1: Потенциальные функции, которые имеют первый аргумент типа int |
Набор 2: Потенциальные функции, которые имеют второй аргумент типа int |
---|---|
Версия 2int может быть преобразован в long с помощью стандартного преобразования) |
Версия 1int может быть преобразован в long с помощью стандартного преобразования) |
Обратите внимание, что пересечение между этими наборами 2 пусто.Таким образом, компилятор формирует сообщение об ошибке.
В качестве аргумента функции с соответствующим n аргументы по умолчанию обрабатываются как n+1 отдельные функции с различным количеством аргументов.
Многоточие (...) действует как подстановочный знак; соответствует любому фактическому аргументу.Это может привести к многим неоднозначных наборов, если не разработать свои наборы перегруженные функции с особой осторожностью.
Примечание |
---|
Неоднозначности перегруженных функций не может быть определено до тех пор, пока не встретится вызов функции.В этот момент наборы создаются для каждого аргумента в вызове функции и можно определить, существует ли точным выраженная перегрузка.Это означает, что неоднозначности может оставаться в коде до тех пор, пока они не вызваны конкретным вызовом функции. |