Эта программа
#include <iostream>
#include <locale>
int main () {
std::isxdigit(std::cin.peek(), std::cin.getloc());
}
выдает исключение типа std::bad_cast
на меня при компиляции с gcc или clang с использованием libstdc ++. Работает нормально с VS2010.
Я понимаю, что здесь происходит. peek()
возвращает int
чтобы приспособить внеполосное значение EOF. Места не обязаны иметь ctype<int>
фасет (у них есть этот фасет в VS, возможно, как расширение). Если у локали нет фасета для выполнения функции, она выдаст bad_cast
,
Но не должно ли это работать в соответствии с духом оригинала <ctype.h>
? Это дефект в стандарте? Есть ли общепринятый обходной путь? Я знаю, что могу сам проверить EOF и привести к соответствующему типу персонажа, но я бы не стал изобретать велосипед.
Нет: тип символа должен быть известен (предположим, что 32-битное int — это тип символа, имеющий 64-битное представление для EOF). Это не может быть решено, локаль не привязана к определенному типу символа, но это аспекты.
Наличие:
std::isxdigit<char>(std::cin.peek(), std::cin.getloc());
уточнит вызов и (!) проигнорирует EOF, сделав его char (int (-1)).
Следовательно, вы можете проверить EOF самостоятельно.
Других решений пока нет …