[英]“ctype” functions from <locale> throw an std::bad_cast
这个计划
#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>
facet(它们在VS中具有此方面,可能作为扩展)。 如果语言环境没有facet来执行函数,它将抛出bad_cast
。
但是这不应该按照原来的<ctype.h>
的精神工作吗? 这是标准中的缺陷吗? 有一个普遍接受的解决方法吗? 我知道我可以自己检查EOF并投射到相关的角色类型,但我宁愿不重新发明轮子。
否:必须知道字符类型(假设32位int是具有64位EOF表示的字符类型)。 它无法解决,区域设置不受特定字符类型的限制,但它的方面是。
有:
std::isxdigit<char>(std::cin.peek(), std::cin.getloc());
将澄清调用和(!)忽略EOF使其成为char(int(-1))。
因此,您可以自己检查EOF。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.