C++11は、標準の UTF-8 <-> UTF-16/UCS2/UCS4 変換にstd::wstring_convert
最適です。*
ただし、からではないファセットを使用して wstring_convert または wbuffer_convert をインスタンス化しようとすると、<codecvt>
期待どおりに機能しませんでした。
// works as expected
std::wstring_convert<std::codecvt_utf8<wchar_t>> ucs4conv;
// Now, by analogy, I want to try this:
std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t>> gbconv(
new std::codecvt_byname<wchar_t, char, std::mbstate_t>("zh_CN.gb18030"));
Clang ++は、「〜wstring_convertでcodecvt <>の保護されたデストラクタを呼び出しています」というエラーを出します
Visual Studio ではそれが可能です (ただし、そのロケールはありませんが、それは別の話です)。これは、その wstring_convert がメンバーとして保持するロケール オブジェクトへのファセット ポインターの有効期間管理をポーンし、ロケールがすべてのファセットへのポインターを削除する方法を知っているためです。
Visual Studio は正しく、libc++ は間違っていますか?
*
clang++-2.9/libc++-svn および Visual Studio 2010 EE SP1 で実装されているように、次の例は両方で機能しますが、悲しいことに GCC では機能しません: https://ideone.com/hywz6