Rationale for cmath's std::abs(short) -> double
Stephan Bergmann
sbergman@redhat.com
Wed Feb 3 10:25:00 GMT 2016
I once again wonder why
<https://gcc.gnu.org/viewcvs/gcc?view=revision&revision=150022> added that
> template<typename _Tp> typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, double>::__type abs(_Tp)
overload to cmath, causing a call to std::abs with an argument of type
short to return a double, even if cstdlib is also included (which
declares the int, long, long long overloads). That commit does not give
any rationale.
(I apparently wondered about that already a couple of years ago, but all
I can find now in my notes is "[...] only to discover libstdc++'s
over-eager interpretation of C++11 cmath requirements causes std::abs
with a short argument to chose the double overload," which no longer
rings much of a bell with me.)
This issue happens to crop up again now in the context of the
LibreOffice code base, see <https://gerrit.libreoffice.org/#/c/22050/>
"Make abs return int, not double," which reportedly is on Fedora Rawhide.
More information about the Libstdc++
mailing list