«abs» и «fabs» идентичны только для типов с плавающей запятой C ++, когда они могут быть переведены без неоднозначных сообщений о перегрузке.
Я использую g ++ (g ++ - 7).Вместе с использованием шаблонов и особенно при использовании mpreal существуют случаи с жесткими сообщениями «неоднозначной перегрузки» - abs(static_cast<T>(x))
не всегда решает это.Когда абс неоднозначен, есть вероятность, что потрясающая работа работает, как ожидалось.Для sqrt я не нашел такого простого побега.
Уже несколько недель я тяжело бьюсь над C ++ "не существует проблем".Я обновляю старую программу C ++ до C ++ 14 для большего и лучшего использования шаблонов, чем раньше.Часто один и тот же параметр шаблона может быть действительным для любого стандартного типа с плавающей запятой или сложного типа или типа класса.Почему длинный двойной действовал несколько более разумно, чем другие типы.Все работало, и я включил mpreal раньше.Затем я установил тип плава по умолчанию mpreal и получил поток синтаксических ошибок.Это дало тысячи неоднозначных перегрузок, например, для abs и sqrt, которые требовали разных решений.Некоторым нужны были перегруженные справочные функции, но за пределами шаблона.Пришлось индивидуально заменить тысячу использований 0.0L и 1.0L точным типом константы с использованием Zero или One или type_cast - автоматическое определение преобразования невозможно из-за неоднозначностей.очень хорошо.Но гораздо проще было бы без них, и иметь константы сохранения типов с безопасными явными type_casts для любого другого стандартного константного типа.