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




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


   return 0;

}

При вызове функции calc() применяется стандартное преобразование из целого типа int в тип с плавающей точкой float. В зависимости от значения переменной i может оказаться, что его нельзя сохранить в типе float без потери точности.

Предполагается, что все стандартные изменения требуют одного объема работы. Например, преобразование из char в unsigned char не более приоритетно, чем из char в double. Близость типов не принимается во внимание. Если две устоявших функции требуют для установления соответствия стандартной трансформации фактического аргумента, то вызов считается неоднозначным и помечается компилятором как ошибка. Например, если даны две перегруженные функции:

extern void manip( long );

extern void manip( float );

то следующий вызов неоднозначен:

int main() {

   manip( 3.14 );   // ошибка: неоднозначность

                    // manip( float ) не лучше, чем manip( int )

   return 0;

}

Константа 3.14 имеет тип double. С помощью того или иного стандартного преобразования соответствие может быть установлено с любой из перегруженных функций. Поскольку есть две трансформации, приводящие к цели, вызов считается неоднозначным. Ни одно преобразование не имеет преимущества над другим. Программист может разрешить неоднозначность либо путем явного приведения типа:

manip ( static_cast<long>( 3.14 ) );   // manip( long )

либо используя суффикс, обозначающий, что константа принадлежит к типу float:

manip ( 3.14F ) );   // manip( float )

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

extern void farith( unsigned int );

extern void farith( float );

int main() {

   // каждый из последующих вызовов неоднозначен

   farith( 'a' );       // аргумент имеет тип char

   farith( 0 );         // аргумент имеет тип int

   farith( 2uL );       // аргумент имеет тип unsigned long

   farith( 3.14159 );   // аргумент имеет тип double

   farith( true );      // аргумент имеет тип bool




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