[cfe-dev] [libc++] std::abs for floating point values
Howard Hinnant
hhinnant at apple.com
Thu May 3 08:00:46 PDT 2012
On May 3, 2012, at 10:37 AM, Luc Bourhis wrote:
> Hi,
>
> using the version of libc++ installed on Lion by XCode 4.3, <cmath> defines std::abs as follow
>
> template <class _A1>
> inline _LIBCPP_INLINE_VISIBILITY
> typename enable_if<is_floating_point<_A1>::value, _A1>::type
> abs(_A1 __x) {return fabs(__x);}
>
> whereas <cstdlib> defines it as a mere bunch of overloaded functions
>
> inline _LIBCPP_INLINE_VISIBILITY long abs( long __x) {return labs(__x);}
> inline _LIBCPP_INLINE_VISIBILITY long long abs(long long __x) {return llabs(__x);}
>
> I have got a class like_double in my code that has a conversion operator to double. Because of the enable_if, a code such as
>
> like_double x; ... std::abs(x) ...
>
> will fail to compile as the compiler will only consider std::abs(int), std::abs(long), and std::abs(long long) and therefore report ambiguities.
>
> Why is one header using enable_if and not the other one? Is enable_if compulsory at all to abide to the standard here actually?
>
> I encountered that problem as I converted my code to use libc++ instead of libstdc++ 4.2 which used to the default on MacOS and which did not restrict the floating point types.
I've committed a fix in revision 156064.
Most of the cmath functions remain templates in order to handle integral arguments. However since integral arguments for abs are already handled in <cstdlib> we do not need to follow that design pattern with abs.
Thanks for your report.
Howard
More information about the cfe-dev
mailing list