这个程序
#include <iostream>
#include <locale>
int main () {
std::isxdigit(std::cin.peek(), std::cin.getloc());
}
当使用libstdc ++使用gcc或clang编译时,会抛出类型std::bad_cast
的异常。它与VS2010一起正常运行。
我明白这里发生了什么。 peek()
返回int
以适应带外EOF值。区域设置不需要具有ctype<int>
方面(它们在VS中具有此方面,可能作为扩展)。如果语言环境没有构造函数的方面,它将抛出bad_cast
。
但是这不应该按照原<ctype.h>
的精神运作吗?这是标准中的缺陷吗?有一个普遍接受的解决方法吗?我知道我可以自己检查EOF并转换为相关的角色类型,但我宁愿不重新发明轮子。
答案 0 :(得分:1)
否:必须知道字符类型(假设32位int是具有64位EOF表示的字符类型)。它无法解决,区域设置不受特定字符类型的限制,但它的方面是。
有:
std::isxdigit<char>(std::cin.peek(), std::cin.getloc());
将澄清调用并且(!)忽略EOF使其成为char(int(-1))。
因此您可以自己检查EOF。