来自<locale>的“ctype”函数抛出std :: bad_cast </locale>

时间:2013-10-29 12:03:56

标签: c++ locale facet libstdc++

这个程序

#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并转换为相关的角色类型,但我宁愿不重新发明轮子。

1 个答案:

答案 0 :(得分:1)

否:必须知道字符类型(假设32位int是具有64位EOF表示的字符类型)。它无法解决,区域设置不受特定字符类型的限制,但它的方面是。

有:

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

将澄清调用并且(!)忽略EOF使其成为char(int(-1))。

因此您可以自己检查EOF。