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




Подробнее о точном соответствии


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

int max( int, int );

double max( double, double );

int i1;

void calc( double d1 ) {

   max( 56, i1 );    // точно соответствует max( int, int );

   max( d1, 66.9 );  // точно соответствует max( double, double );

}

Перечислимый тип точно соответствует только определенным в нем элементам перечисления, а также объектам, которые объявлены как принадлежащие к этому типу:

enum Tokens { INLINE = 128; VIRTUAL = 129; };

Tokens curTok = INLINE;

enum Stat { Fail, Pass };

extern void ff( Tokens );

extern void ff( Stat );

extern void ff( int );

int main() {

   ff( Pass );       // точно соответствует ff( Stat )

   ff( 0 );          // точно соответствует ff( int )

   ff( curTok );     // точно соответствует ff( Tokens )

   // ...

}

Выше уже упоминалось, что фактический аргумент может точно соответствовать формальному параметру, даже если для приведения их типов необходимо некоторое тривиальное преобразование, первое из которых – преобразование l-значения в r-значение. Под l-значением понимается объект, удовлетворяющий следующим условиям:

  • можно получить адрес объекта;
  • можно получить значение объекта;
  • это значение легко модифицировать (если только в объявлении объекта нет спецификатора const).
  • Напротив, r-значение – это выражение, значение которого вычисляется, или выражение, обозначающее временный объект, для которого нельзя получить адрес и значение которого нельзя модифицировать. Вот простой пример:

    int calc( int );

    int main() {

       int lval, res;

       lval = 5;     // lvalue: lval; rvalue: 5

       res = calc( lval );

                     // lvalue: res

                     // rvalue: временный объект для хранения значения,

                     // возвращаемого функцией calc()




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