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.