Reputation: 14977
Here lists the current overloads of std::abs
in C++. I'm wondering why not just define the following template and let go all the ugly C-style overloads?
template <typename T> inline
T abs(const T& v) { return v < 0 ? -v : v; }
Upvotes: 26
Views: 7002
Reputation: 179907
See LWG issue 2192. Currently, std::abs(x-y) < 2
fails if x
and y
are unsigned. This catches a subtle programming error. With the proposed change, it compiles but does entirely the wrong thing. abs(3u-4u)
would be much larger than 2, in fact it's UINT_MAX
.
Upvotes: 22
Reputation:
This suffers the usual problem of matching everything.
An example of a type for which abs
makes sense but this implementation does not is complex<double>
.
Upvotes: 11
Reputation: 355
Because type 'T' can access any data type including char. So what are you expecting if someone will pass a char to the abs function. :)
Upvotes: 0