In C++, why does <cctype> define both std::isspace and ::isspace? -
and why c++ compilers able deduce type of ::isspace
, implicitly convert std::function
, not able std::isspace
?
please see the following not compile:
#include <cctype> #include <functional> template <typename functish> bool bar1(functish f) { return f('a'); } inline bool bar2(std::function<bool(char)> f) { return f('a'); } #if 1 #define ff &std::isspace #else #define ff &::isspace #endif #if 0 bool foo() { return bar1(ff); } #else bool foo() { return bar2(ff); } #endif
of compilers supported compiler explorer, ellcc seems 1 std::isspace
has deducibility/convertibility expect.
there multiple overloads of std::isspace
, 1 ::isspace
.
the header <cctype> declares function int std::isspace(int)
, , maybe declares same function in global namespace (it doesn't have though).
the header <locale> defines function template template <class chart> bool std::isspace(chart, const std::locale&)
.
the header <ctype.h> declares function int isspace(int)
, , may declare same function in namespace std
(it doesn't have though).
it seems on compilers besides ellcc, <cctype> includes <locale> (or both std::isspace
overloads declared somewhere else , included both headers). standard specifies symbols standard headers must declare; doesn't prohibit them declaring other symbols aren't required.
since std::isspace
overloaded, you'll have cast int(*)(int)
compiler knows overload select.
Comments
Post a Comment