在C ++ 17中为char8_t做准备

时间:2019-06-25 00:37:43

标签: c++

我正在使用Microsoft Visual C ++ 16.1(2019社区),正在尝试编写在C ++ 2020中“正确”的代码,该代码应具有char8_t类型,该类型将是未签名的char。我定义这样的类型:

using char8_t = unsigned char;

代码如下:

std:string data;
const char8_t* ptr = data.c_str ();

不会编译,因为如果没有reinterpret_cast,它将不会将有符号的char指针转换为无符号的char指针。我可以做些什么来为2020年做准备,而无需在各地重新诠释演员阵容?

2 个答案:

答案 0 :(得分:0)

感谢您的评论。这些评论和进一步的研究纠正了引起最初问题的主要误解。我现在知道2020 char8_t不是UTF-8字符,而2020 u8string不是UTF-8字符串。尽管可以在“ UTF-8字符串”实现中使用它们,但事实并非如此。

因此,看来reinterpret_cast的使用是不可避免的,但可以隐藏/隔离到一组内联函数重载(或一组功能模板)。必须将utf8string对象(可能是模板)作为一个不同的对象来实现(如果这样的地方尚不可用)。

答案 1 :(得分:0)

P1423 (char8_t backward compatibility remediation)介绍了许多方法,这些方法可用于补救由于通过P0482 (char8_t: A type for UTF-8 characters and strings)采用char8_t而引起的向后兼容性影响。

由于char8_t是非别名类型,因此使用reinterpret_cast来将char8_t指针分配给指向char的指针是未定义的行为,如下所示:在reinterpret_cast<const char8_t*>(data.c_str())中。但是,由于允许charunsigned char作为任何类型的别名,因此可以在另一个方向使用reinterpret_cast,例如reinterpret_cast<const char*>(u8"text")

P1423中没有记录的补救方法是灵丹妙药。您需要评估哪种方法最适合您的用例。您可能还喜欢C++20 with u8, char8_t and std::string中的答案。

关于char8_t不是UTF-8字符和u8string不是UTF-8字符串,这是正确的,char8_t是代码单元类型(不是代码点类型),并且该u8string不会强制使用格式正确的UTF-8序列。但是,意图是这些类型只能用于UTF-8数据。