【问题标题】:"ctype" functions from <locale> throw an std::bad_cast<locale> 中的“ctype”函数抛出 std::bad_cast
【发布时间】:2013-10-29 12:03:56
【问题描述】:

这个程序

#include <iostream>
#include <locale>

int main () {
    std::isxdigit(std::cin.peek(), std::cin.getloc());
}

当使用 gcc 或 clang 使用 libstdc++ 编译时,我会抛出 std::bad_cast 类型的异常。用VS2010可以正常运行。

我明白这里发生了什么。 peek() 返回 int 以适应带外 EOF 值。语言环境不需要有ctype&lt;int&gt; 方面(他们在VS 中确实有这个方面,也许作为扩展)。如果语言环境没有执行功能的方面,它将抛出bad_cast

但这不应该按照原始&lt;ctype.h&gt; 的精神工作吗?这是标准的缺陷吗?是否有普遍接受的解决方法?我知道我可以自己检查 EOF 并转换为相关的字符类型,但我不想重新发明轮子。

【问题讨论】:

    标签: c++ locale facet libstdc++


    【解决方案1】:

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

    拥有:

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

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

    因此您可以自己检查 EOF。

    【讨论】:

    • 曾经有一个习惯用法是使用ctype 函数和EOF。我理解为什么这个成语在本地环境中不起作用。我在问标准委员会成员是否知道他们破坏它时他们在做什么,以及他们或其他任何人是否想到了替代方案。用 EOF 检查器包装这些函数的解决方案并没有让我觉得特别优雅。如果每个人都需要封装这些函数,为什么封装的版本不是标准的一部分?
    猜你喜欢
    • 2012-10-19
    • 2023-03-28
    • 2013-07-11
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2020-07-17
    • 2014-04-11
    • 1970-01-01
    相关资源
    最近更新 更多