ワイド文字列の先頭のスペースをスキップするには、クロスプラットフォーム コードが必要です。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::id のファセットが含まれていない場合の bad_cast 例外」
では、g++ がワイド文字列をどのように扱うのかという一般的な質問はありますか? より狭い質問 - 少なくとも ctype のファセットを初期化する方法は?
更新: いくつかの実験の後、Linux g++ がワイド文字列のファセットを正しく初期化することを発見しました。そのため、コードは機能します。説明されている問題は、mingw のみの場合の機能です。