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