前提
- 我有一个二进制数据块在内存中,以
char*
表示(可能从文件中读取或通过网络传输)。 - 我知道它包含某个偏移量处特定长度的UTF8编码文本字段。
问题
如何(安全和便携地)获取u8string_view
来表示此文本字段的内容?
动机
将该字段作为u8string_view
传递给下游代码的动机是:
- 它非常清楚地表明了文本字段是UTF8编码的,不像
string_view
。 - 它避免了将其作为
u8string
返回的成本(可能是自由存储器分配+复制)。
我尝试过的方法
实现此目的的简单方法是:
char* data = ...;
size_t field_offset = ...;
size_t field_length = ...;
char8_t* field_ptr = reinterpret_cast<char8_t*>(data + field_offset);
u8string_view field(field_ptr, field_length);
然而,如果我正确理解C++的严格别名规则,这是未定义行为,因为它通过由reinterpret_cast
返回的char8_t*
指针访问char*
缓冲区的内容,而char8_t
不是一种别名类型。
这是真的吗?
有没有安全的方法可以做到这一点?
char
在这里是特殊的。gcc/clang 是否发出警告? - Berndstd::start_lifetime_as
,但我不确定除了承认你正在UB(未定义行为)的情况下是否有任何帮助解决这个问题的东西在C++20中。 - Guillaume Racicot