Подтвердить что ты не робот

Почему С++ задает этот комплекс только для создания float, double или long double?

В соответствии со спецификацией ISO С++, раздел 26.2/2:

Эффект создания шаблона complex для любого типа, отличного от float, double или long double, не указан.

Почему стандартные авторы явно добавляют это ограничение? Это делает его неуказанным, например, что происходит, если вы делаете complex<int> или complex<MyCustomFixedPointType> и представляете собой искусственное ограничение.

Есть ли причина для этого ограничения? Есть ли обходной путь, если вы хотите создать экземпляр complex со своим собственным типом?

Я прежде всего задаю этот вопрос из-за этого более раннего вопроса, в котором OP был смущен тем, почему abs давал причудливые выходы для complex<int>, Тем не менее, это все еще не имеет смысла, учитывая, что мы также можем сделать цифры complex из типов фиксированных точек, более высоких точных чисел и т.д.

4b9b3361

Ответ 1

Вы не можете правильно реализовать многие операции std::complex для целых чисел. Например.

template <class T>
T abs(const complex<T> &z);

для a complex<long> не может иметь возвращаемое значение T = long, когда комплексные числа представляются как пары (real, imag), так как он возвращает значение sqrt(pow(z.real(), 2) + pow(z.imag(), 2)). Только несколько операций будут иметь смысл.

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

Наконец, как бы вам понравилось ваше "комплексное целочисленное деление", и вам понравится "сложный остаток"?:)

Подводя итог, я думаю, было бы разумнее указать отдельный тип gaussian_int<T> всего несколькими операциями, чем поддержка трансплантата для интегрального T на std::complex.

Ответ 2

Вероятно, для совместимости со вспомогательными функциями. Например:

template<class T> T abs (const complex<T>& x);

Если T == int, abs вернет int, что будет означать массовую потерю точности.