簡體   English   中英

“ctype”的功能來自 <locale> 拋出一個std :: bad_cast

[英]“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM