isspace
также является шаблоном в C ++, который принимает шаблонный символ, а также локаль, с которой он использует фасет std::ctype<T>
для классификации данного символа (поэтому он не может решить, какую версию взять,и как таковой игнорирует шаблон).
Попробуйте указать, что вы имеете в виду версию совместимости C: static_cast<int(*)(int)>(isspace)
.Различия между компиляторами могут быть связаны с непоследовательной обработкой вывода из имени перегруженной функции среди компиляторов - см. Этот clang PR .См. Второй случай в первом наборе тестов Фейсала для аналогичного случая.
Кто-то указал на IRC, что этот код будет вызывать isspace
, используя char
- но isspace
принимает int
и требует, чтобы значение было в диапазоне unsigned char
значения или EOF
.Теперь, если char
подписано на вашем ПК и хранит отрицательное значение, отличное от EOF, это приведет к неопределенному поведению.
Я рекомендую сделать это так, как говорит @Kirill в комментарии, и просто использовать шаблон std::isspace
- тогда вы также можете избавиться от аргумента объекта функции.