& Quot; CType & Quot; функции из & lt; locale & gt; кинь std :: bad_cast

Эта программа

#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 и привести к соответствующему типу персонажа, но я бы не стал изобретать велосипед.

4

Решение

Нет: тип символа должен быть известен (предположим, что 32-битное int — это тип символа, имеющий 64-битное представление для EOF). Это не может быть решено, локаль не привязана к определенному типу символа, но это аспекты.

Наличие:

std::isxdigit<char>(std::cin.peek(), std::cin.getloc());

уточнит вызов и (!) проигнорирует EOF, сделав его char (int (-1)).

Следовательно, вы можете проверить EOF самостоятельно.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]