gpt4 book ai didi

c++ - libc++ 与 VC++ : Can non-UTF conversions be done with wstring_convert?

转载 作者:可可西里 更新时间:2023-11-01 17:39:39 26 4
gpt4 key购买 nike

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<> 的 protected 析构函数”

Visual Studio 允许它(尽管它缺少语言环境,但这是另一回事),因为它的 wstring_convert 将 facet 指针的生命周期管理典当为它作为成员持有的语言环境对象,而语言环境知道如何删除指向的指针所有方面。

Visual Studio 正确而 libc++ 错误吗?

<子> *正如在 clang++-2.9/libc++-svn 和 Visual Studio 2010 EE SP1 中实现的那样,以下示例适用于两者,但不适用于 GCC,遗憾的是:https://ideone.com/hywz6

最佳答案

诚然,我对这个答案有偏见。但我会尝试引用 N3290(遗憾的是不再公开)来支持我的主张。我也会提供一个解决方案。

分析:

[conversions.string]/p2 中wstring_convert 的概要包括:

private:
byte_string byte_err_string; // exposition only
wide_string wide_err_string; // exposition only
Codecvt *cvtptr; // exposition only
state_type cvtstate; // exposition only
size_t cvtcount; // exposition only

“仅限说明”意味着 wstring_convert 不必按此拼写顺序包含这些成员。但是“仅展示”成员用于描述各种成员的效果,并且这些规范具有约束力。

所以问题似乎变成了:

What is the specification of ~wstring_convert()?

这在同一部分 ([conversions.string]) 的第 17 页中找到:

~wstring_convert();

Effects: The destructor shall delete cvtptr.

这对我来说意味着 ~Codecvt() 必须是可访问的,因此 libc++ 遵循 C++11 规范。

我也同意这是一个皇家痛苦的屁股。

解决方案:

事实证明,让所有 C++98/03 方面都具有 protected 析构函数非常不方便。这是一个可以接受任何方面并为其提供公共(public)析构函数的适配器:

template <class Facet>
class usable_facet
: public Facet
{
public:
template <class ...Args>
usable_facet(Args&& ...args)
: Facet(std::forward<Args>(args)...) {}
~usable_facet() {}
};

您现在可以在您的代码中使用这个通用适配器:

typedef usable_facet<std::codecvt<wchar_t, char, std::mbstate_t>> C;
std::wstring_convert<C> gbconv(new C("zh_CN.gb18030"));

希望这对您有所帮助。

关于c++ - libc++ 与 VC++ : Can non-UTF conversions be done with wstring_convert?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7599514/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com