2013-10-29 51 views
4

這個程序「CTYPE」 功能引發的std :: bad_cast

#include <iostream> 
#include <locale> 

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

當用gcc或使用鏗鏘++的libstdc編譯對我拋出std::bad_cast類型的異常。它通常與VS2010一起運行。

我明白這裏發生了什麼。 peek()返回int以適應帶外EOF值。語言環境不需要具有ctype<int>構面(它們在VS中具有此方面,可能作爲擴展)。如果語言環境沒有執行功能的方面,則會拋出bad_cast

但是,不應該按照原始<ctype.h>的精神工作嗎?這是標準中的缺陷嗎?是否有一個普遍接受的解決方法?我知道我可以自己檢查EOF並投射到相關的字符類型,但我寧願不要重新發明輪子。

回答

1

否:必須知道字符類型(假定32位int是具有用於EOF的64位表示的字符類型)。它無法解析,語言環境不受特定字符類型的約束,但它的方面是。

有:

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

將澄清通話,而忽略EOF使其CHAR(INT(-1))(!)。

因此,你可能會自己檢查EOF。

+0

曾經有一種習慣於使用'ctype'函數和EOF。我明白爲什麼這個習語在現場土地上不起作用。我問,標準委員會成員是否知道他們在破產時做了什麼,以及他們或其他人是否想到替代方案。用EOF檢查器包裝這些功能的解決方案不會讓我感到特別優雅。如果每個人都需要包裝這些功能,爲什麼包裝版本不是標準的一部分? –