2.4 Неявные преобразования типов
Конструкторы специализированных версий для типов float double и long double спроектированы так, чтобы безопасные преобразования типов (например, complex в complex) могли выполняться неявно, а потенциально рискованные преобразования (например, complex в complex) были:
std::complex cf;
std::complex cd;
std::complex cld;
std::complex cd1 =cf: // OK: безопасное преобразование
std::complex cd2 = сld: // ОШИБКА: нет неявного преобразования
std::complex cd3(cld); // OK: явное преобразование
He существует конструкторов, создающих комплексное число по другим комплексным типам. В частности, нельзя преобразовать complex с целым типом в complex с типом float, double или long double. Впрочем, преобразования можно выполнять при передаче вещественной и мнимой частей в отдельных аргументах:
std::complex cd;
std::complex ci;
std::complex cd4 = ci; // ОШИБКА: небезопасное преобразование std::complex cd5(ci); // ОШИБКА: нет явного преобразования
std: :complex cd6(ci.real () .ci .imag()); // OK
К сожалению, операторы присваивания позволяют выполнять небезопасные преобразования. Они определены в виде шаблонов для всех типов, поэтому присваивание допустимо для любых комплексных типов (при возможности пре-образования типа значения):
std: :complex cd;
std: :complex cld;
std::complex ci;
Эта проблема также относится к функциям polar() и conj(). Например, следующая запись работает нормально:
std::complex c2(std::polar(4.2.0.75)); // OK
С другой стороны, запись со знаком = не работает:
std::complex с2 = std::polar(4.2.0.75); // ОШИБКА
Дело в том, что выражение std::polar(4.2,0.75) создает временный объект complex, а неявное преобразование из complex в complex не определено.
Do'stlaringiz bilan baham: |