![](/img/trans.png)
[英]enum to string in modern C++11 / C++14 / C++17 and future C++20
[英]Using UTF-8 string-literal prefixes portably between C++17 and C++20
我有一个用 C++17 编写的代码库,它大量使用 UTF-8 和c++11 中引入的u8
字符串文字来指示 UTF 编码。 但是,c++20 将u8
文字在 C++中的含义从产生char
或const char*
更改为char8_t
或const char8_t*
; 后者不是隐式指针可转换为const char*
。
我希望这个项目支持在 C++17 和 C++20 模式下运行而不会损坏; 可以做些什么来支持这一点?
目前,该项目使用char8
别名,该别名使用u8
文字的类型结果:
// Produces 'char8_t' in C++20, 'char' in anything earlier
using char8 = decltype(u8' ');
但是这种方法存在一些问题:
char
不保证是无符号的,这使得从数值生成代码点不可移植(例如char8{129}
与char
中断,但不与char8_t
)。
char8
与 C++17 中的char
没有区别,可能会破坏现有代码,并可能导致错误。
从第 2 点继续,不可能在 C++17 中用char8
重载char
来处理不同的编码,因为它们不是唯一的类型。
可以做些什么来支持在 C++17 和 C++20 模式下运行,同时避免类型差异问题?
我建议在 C++20 之前的版本中简单地将您自己的char8_t
和u8string
类型声明为别名unsigned char
和basic_string<unsigned char>
。 然后在遇到转换问题的任何地方,您都可以编写包装函数以在每个版本中适当地处理它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.