С++ для начинающих




Подробнее о точном соответствии - часть 4


typedef int (*PFI)( const string &, const string & );

void sort( string *, string *, PFI );

string as[10];

int main()

{

   // ...

   sort( as,

         as + sizeof(as)/sizeof(as[0] - 1 ),

         lexicoCompare   // точное соответствие

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

        );

   return 0;

}

Перед вызовом sort() применяется преобразование функции в указатель, которое приводит аргумент lexicoCompare от типа “функция” к типу “указатель на функцию”. Хотя формальным параметром функции является указатель, а  фактическим – имя функции и, следовательно, было произведено преобразование функции в указатель, считается, что фактический аргумент точно третьему формальному параметру функции sort().

Последнее из перечисленных выше – это преобразование спецификаторов. Оно относится только к указателям и заключается в добавлении спецификаторов const или volatile (или обоих) к типу, который адресует данный указатель:

int a[5] = { 4454, 7864, 92, 421, 938 };

int *pi = a;

bool is_equal( const int * , const int * );

void func( int *parm ) {

   // точное соответствие между pi и parm: преобразование спецификаторов

   if ( is_equal( pi, parm ) )

      // ...

     return 0;

}

Перед вызовом функции is_equal() фактические аргументы pi и parm преобразуются из типа “указатель на int” в тип “указатель на const int”. Эта трансформация заключается в добавлении спецификатора const к адресуемому типу, поэтому относится к категории преобразований спецификаторов. Несмотря на то, что функция ожидает получить два указателя на const int, а фактические аргументы являются указателями на int, считается, что точное соответствие между формальными и фактическими параметрами функции is_equal() установлено.

Преобразование спецификаторов применимо только к типу, который адресует указатель. Оно не употребляется в случае, когда формальный параметр имеет спецификатор const или volatile, а фактический аргумент – нет.




Содержание  Назад  Вперед