Программирование >>  Инициализация объектов класса, структура 

1 ... 150 151 152 [ 153 ] 154 155 156 ... 395


char* format( int );

void g() {

глобальная функция format( int ) скрыта char* format( double ); char* format( char* );

format(3); есть только одна устоявшая функция: format( double )

формального параметра char*, а следовательно, функция не может считаться устоявшей.

В следующем примере все три функции-кандидата оказываются устоявшими для вызова max() внутри func() . Все они могут быть вызваны с двумя аргументами. Поскольку фактические аргументы имеют тип int, они точно соответствуют формальным параметрам функции libs R us::max(int, int) и могут быть приведены к типам параметров функции libs R us::max(double, double) с помощью трансформации целых в плавающие, а также к типам параметров функции libs R us::max(char,

namespace libs R us { int max( int, int ); double max( double, double );

using-объявление using libs R us::max;

char max( char, char );

void func()

все три функции max() являются устоявшими

max( 87, 65 ); вызывается using libs R us::max( int, int ) char) посредством преобразования целых типов.

Обратите внимание, что функция-кандидат с несколькими параметрами исключается из числа устоявших, как только выясняется, что один из фактических аргументов не может быть приведен к типу соответствующего формального параметра, пусть даже для всех остальных аргументов такое преобразование существует. В следующем примере функция min(char *, int) исключается из множества устоявших, поскольку нет возможности трансформации типа первого аргумента int в тип соответствующего параметра char *. И это происходит несмотря на то, что второй аргумент точно соответствует второму параметру.

устояла; она тоже имеет один параметр типа double, и он точно соответствует фактическому аргументу. Функции-кандидаты f() и f(char*, char*) исключены из списка устоявших, так как они не могут быть вызваны с одним аргументом.

В следующем примере единственной устоявшей функцией для вызова format(3) является formiat(double). Хотя кандидата formiat(char*) можно вызывать с одним аргументом, не существует преобразования из типа фактического аргумента int в тип



extern double min( double, double ); extern double min( char*, int );

void func() {

одна функция-кандидат min( double, double ) min( 87, 65 ); вызывается min( double, do

Если после исключения из множества кандидатов всех функций с несоответствующим числом параметров и тех, для параметров которых не оказалось подходящего преобразования, не осталось устоявших, то обработка вызова функции заканчивается

void print( unsigned int ); void print( char* ); void print( char );

int *ip;

class SmallInt { /* ... */ }; SmallInt si;

int main() {

print( ip ); ошибка: нет устоявших функций: соответствие не найдено

print( si ); ошибка: нет устоявших функций: соответствие не

найдено return 0;

ошибкой компиляции. В таком случае говорят, что соответствия не найдено.

9.4.3. Наилучшая из устоявших функция

Наилучшей считается та из устоявших функций, формальные параметры которой наиболее точно соответствуют типам фактических аргументов. Для любой такой функции преобразования типов, применяемые к каждому аргументу, ранжируются для определения степени его соответствия параметру. (В разделе 6.2 описаны поддерживаемые преобразования типов.) Наилучшей из устоявших называют функцию, для которой одновременно выполняются два условия:

преобразования, нримененн1е к аргументам, не хуже преобразований, необходимых для вызова любой другой устоявшей функции;

хотя бы для одного аргумента примененное преобразование лучше, чем для того же аргумента в любой другой устоявшей функции.

Может оказаться так, что для приведения фактического аргумента к тину соответствующего формального параметра нужно выполнить несколько преобразований. Так, в следующем примере



int arr[3];

void putValues(const int *); int main() {

putValues(arr); необходимо 2 преобразования

return 0;

массив в указатель + преобразование спецификатора

для приведения аргумента arr от типа массив из трех int к типу указатель на const int применяется последовательность преобразований:

1. Преобразование массива в указатель, которое трансформирует массив из трех int в указатель на int.

2. Преобразование спецификатора, которое трансформирует указатель на int в указатель на const int.

Поэтому было бы более правильно говорить, что для приведения фактического аргумента к типу формального параметра устоявшей функции требуется последовательность преобразований. Поскольку применяется не одна, а несколько трансформаций, то на третьем шаге процесса разрешения перегрузки функции на самом деле ранжируются последовательности преобразований.

Рангом такой последовательности считается ранг самой плохой из входящих в нее трансформаций. Как объяснялось в разделе 9.2, преобразования типов ранжируются следующим образом: точное соответствие лучше расширения типа, а расширение типа лучше стандартного преобразования. В предыдущем примере оба изменения имеют ранг точного соответствия. Поэтому и у всей последовательности такой же ранг.

Такая совокупность состоит из нескольких преобразований, применяемых в указанном порядке:

преобразование 1-значения ->

расширение типа или стандартное преобразование ->

преобразование спецификаторов

Термин преобразование l-значения относится к первым трем трансформациям из категории точных соответствий, рассмотренных в разделе 9.2: преобразование 1-значения в г-значение, преобразование массива в указатель и преобразование функции в указатель. Последовательность трансформаций состоит из нуля или одного преобразования 1-значения, за которым следует нуль или одно расширение типа или стандартное преобразование, и наконец нуль или одно преобразование спецификаторов. Для приведения фактического аргумента к типу формального параметра может быть применено только одна трансформация каждого вида.

Описанная последовательность называется последовательностью стандартных преобразований. Существует также последовательность определенных пользователем преобразований, которая связана с функцией-конвертером, являющейся членом класса. (Конвертеры и последовательности определенных пользователем преобразований рассматриваются в главе 15.)

Каковы последовательности изменений фактических аргументов в следующем примере?



1 ... 150 151 152 [ 153 ] 154 155 156 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика