如果编码和宽度相同,将字符串从“wchar_t”转换为“char16_t”是否合法?

Is casting strings from `wchar_t` to `char16_t` legal if encoding and width is the same?

在 Windows 上,wchar_t 是一个 UTF-16(LE) 格式的字符,在大多数情况下,它等同于 char16_t。但是,这两种字符类型在 C++ 类型系统中仍然是不同的类型——这让我不确定根据 C++ 标准,这两种字符类型的 序列 之间的转换是否合法。

我的问题是:在 C++17 中,执行以下转换并读取转换后的指针是否合法:

为了这个问题的目的,假设如下:

基本上,这是否违反了严格的别名?

我的理解是 cast 本身是有效的,这要归功于 [expr.reinterpret.cast]/7,但是不能安全地使用强制转换的结果,因为类型被某些东西别名化了那不是 charunsigned charstd::byte。这个解释正确吗?


注意:其他问题已经问到关于wchar_tchar16_t是一样的,但这个问题是不是 据我所知,它们的副本。值得注意的是,问题“”实际上在指针之间执行 reinterpret_cast,但 none 的答案实际上首先解决了此转换是否合法。

你已经知道这个问题的答案了:strictly speaking, no

wchar_t 不是 char16_t。两者都不是从另一个派生的。两者都不相似。两者都不是另一个的 signed/unsigned 版本。也不是包含 other.And 的聚合,它们都不是字节类型(char,等等)。

因此您不能通过 pointer/reference 访问 wchar_tchar16_t

如果严格避免别名是您的目标,您将不得不将数据复制到不同的对象。 有效,假设它们都具有相同的表示。