我需要跨平台代码来跳过宽字符串的前导空格。看起来 g++(和 Qt 显然)根本没有为宽字符串初始化槽所以下面的代码适用于 VC++ 但几乎 g++ 因 bad_cast 异常而失败:
#include <string>
#include <locale>
#include <iostream>
int main()
{
typedef std::ctype<std::wstring::value_type> vtct;
std::wstring str=L" 1122";
const std::wstring::value_type* unspace =
std::use_facet<vtct>( std::locale::classic() ).
scan_not(std::ctype_base::space|std::ctype_base::punct,
str.c_str(), str.c_str() + str.length());
//std::cout << unspace << std::endl;
wprintf(L"{%s}\n", unspace);
return 0;
}
根据规范:“当 locale 对象中的 facet 存储库不包含具有请求的 locale::id 的 facet 时出现 bad_cast 异常”
所以一般问题g ++如何处理宽字符串?更狭窄的问题 - 如何至少为 ctype 初始化构面?
更新:经过一些实验,我检测到 linux g++ 正确初始化宽字符串的 facet - 所以代码可以工作。显然,如果仅 mingw,则描述的问题是特征。