On 31 December 2015 at 09:57, Marc Glisse wrote:
> On Thu, 31 Dec 2015, Dominik Vogt wrote:
>
>> This snippet ist from the Plumhall 2014 xvs test suite:
>>
>>  #if CXX03 || CXX11 || CXX14
>>  static float (*p1_)(float) = abs;
>>  ...
>>  checkthat(__LINE__, p1_ != 0);
>>  #endif
>>
>> (With the testsuite specific macros doing the obvious).  abs() is
>> declared as:
>>
>>  int abs(int j)
>>
>> Am I missing some odd C++ feature or is that part of the test just
>> plain wrong?  I don't know where to look in the C++ standard; is

Try searching the library clauses (17 to 30) for "abs". You'll find
the answer in 26.8 [c.math].

>> this supposed to compile (with or without a warning?) or generate
>> an error or is it just undefined?
>>
>>  error: invalid conversion from ‘int (*)(int) throw ()’ to ‘float
>> (*)(float)’ [-fpermissive]
>>
>> (Of course even with -fpermissive this won't work because (at
>> least on my platform) ints are passed in different registers than
>> floats.)
>
>
> There are other overloads of 'abs' declared in math.h / cmath (only in
> namespace std in the second case, and there are bugs (or standard issues)
> about having them in the global namespace for the first one).

That's not quite accurate, C++11 was altered slightly to reflect reality.

<cmath> is required to declare std::abs and it's unspecified whether
it also declares it as ::abs.

<math.h> is required to declare ::abs and it's unspecified whether it
also declares it as std::abs.

Reply via email to