4

这个节目

#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

1 回答 1

1

否:必须知道字符类型(假设 32 位 int 是具有 EOF 的 64 位表示的字符类型)。它无法解决,语言环境不限于特定的字符类型,但它的方面是。

有:

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

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

因此,您可以自己检查 EOF。

于 2013-10-29T13:01:48.127 回答