Версия шаблона std:: abs

здесь список текущих перегрузок std::abs в C++. Мне интересно, почему бы просто не определить следующий шаблон и не отпустить все уродливые перегрузки в стиле C?

template <typename T> inline
T abs(const T& v) { return v < 0 ? -v : v; }

3 ответов


посмотреть LWG выпуск 2192. В настоящее время std::abs(x-y) < 2, Если не x и y неподписанные. Это ловит тонкую ошибку программирования. С предлагаемым изменением он компилируется, но делает это совершенно неправильно. abs(3u-4u) было бы намного больше, чем 2, на самом деле это UINT_MAX.


Это страдает обычной проблемой сопоставления всего.

пример типа, для которого abs имеет смысл, но эта реализация не является complex<double>.


потому что тип ' T ' может получить доступ к любому типу данных, включая char. Итак, что вы ожидаете, если кто-то передаст символ функции abs. :)