【发布时间】:2011-11-27 19:25:29
【问题描述】:
C++11 的 std::wstring_convert 非常适合标准 UTF-8 UTF-16/UCS2/UCS4 转换*。但是,当我尝试使用不是来自 <codecvt> 的构面来实例化 wstring_convert 或 wbuffer_convert 时,它没有按预期工作:
// 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 将 facet 指针的生命周期管理典当到它作为成员持有的语言环境对象,并且语言环境知道如何删除指向各个方面。
Visual Studio 是对的,而 libc++ 错了吗?
* 在 clang++-2.9/libc++-svn 和 Visual Studio 2010 EE SP1 中实现,以下示例适用于两者,但不适用于 GCC,遗憾的是:https://ideone.com/hywz6
【问题讨论】:
标签: c++ c++11 non-unicode