C ++ 11 std :: wstring_convert
отлично работает *
для стандартного UTF- 8 Преобразования UTF-16 / UCS2 / UCS4. Однако, когда я попытался создать экземпляр wstring_convert или wbuffer_convert с фасетом не из
, это не сработало, как ожидалось:
// works as expected
std::wstring_convert> ucs4conv;
// Now, by analogy, I want to try this:
std::wstring_convert> gbconv(
new std::codecvt_byname("zh_CN.gb18030"));
Clang ++ выдает ошибку, говоря «вызов защищенного деструктора codecvt . in ~ wstring_convert "
Visual Studio позволяет это (хотя в нем отсутствует этот языковой стандарт, но это уже другая история), потому что его wstring_convert закладывает управление временем жизни указателя фасета на объект языкового стандарта, который он держит в качестве члена, а языковые стандарты знают, как удалить указатели на все фасеты.
Является ли Visual Studio правильной, а libc ++ неправильной?
*
как реализовано в clang ++ - 2.9 / libc ++ - svn и Visual Studio 2010 EE SP1, следующий пример работает на обоих, но не в GCC, к сожалению: https://ideone.com/hywz6