如果编码和宽度相同,将字符串从“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 中,执行以下转换并从读取转换后的指针是否合法:
reinterpret_cast<const wchar_t*>(char16_ptr)
其中 decltype(char16_ptr)
是 const char16_t*
,
reinterpret_cast<const char16_t*>(wchar_ptr)
其中 decltype(wchar_ptr)
是 const wchar_t*
为了这个问题的目的,假设如下:
sizeof(wchar_t) == sizeof(char16_t)
,以及
wchar_t
的格式与 char16_t
相同(与 Windows 相同)
基本上,这是否违反了严格的别名?
我的理解是 cast 本身是有效的,这要归功于 [expr.reinterpret.cast]/7
,但是不能安全地使用强制转换的结果,因为类型被某些东西别名化了那不是 char
、unsigned char
或 std::byte
。这个解释正确吗?
注意:其他问题已经问到关于wchar_t
和char16_t
是一样的,但这个问题是不是 据我所知,它们的副本。值得注意的是,问题“”实际上在指针之间执行 reinterpret_cast
,但 none 的答案实际上首先解决了此转换是否合法。
你已经知道这个问题的答案了:strictly speaking, no。
wchar_t
不是 char16_t
。两者都不是从另一个派生的。两者都不相似。两者都不是另一个的 signed/unsigned 版本。也不是包含 other.And 的聚合,它们都不是字节类型(char
,等等)。
因此您不能通过 pointer/reference 访问 wchar_t
到 char16_t
。
如果严格避免别名是您的目标,您将不得不将数据复制到不同的对象。 有效,假设它们都具有相同的表示。
在 Windows 上,wchar_t
是一个 UTF-16(LE) 格式的字符,在大多数情况下,它等同于 char16_t
。但是,这两种字符类型在 C++ 类型系统中仍然是不同的类型——这让我不确定根据 C++ 标准,这两种字符类型的 序列 之间的转换是否合法。
我的问题是:在 C++17 中,执行以下转换并从读取转换后的指针是否合法:
reinterpret_cast<const wchar_t*>(char16_ptr)
其中decltype(char16_ptr)
是const char16_t*
,reinterpret_cast<const char16_t*>(wchar_ptr)
其中decltype(wchar_ptr)
是const wchar_t*
为了这个问题的目的,假设如下:
sizeof(wchar_t) == sizeof(char16_t)
,以及wchar_t
的格式与char16_t
相同(与 Windows 相同)
基本上,这是否违反了严格的别名?
我的理解是 cast 本身是有效的,这要归功于 [expr.reinterpret.cast]/7
,但是不能安全地使用强制转换的结果,因为类型被某些东西别名化了那不是 char
、unsigned char
或 std::byte
。这个解释正确吗?
注意:其他问题已经问到关于wchar_t
和char16_t
是一样的,但这个问题是不是 据我所知,它们的副本。值得注意的是,问题“reinterpret_cast
,但 none 的答案实际上首先解决了此转换是否合法。
你已经知道这个问题的答案了:strictly speaking, no。
wchar_t
不是 char16_t
。两者都不是从另一个派生的。两者都不相似。两者都不是另一个的 signed/unsigned 版本。也不是包含 other.And 的聚合,它们都不是字节类型(char
,等等)。
因此您不能通过 pointer/reference 访问 wchar_t
到 char16_t
。
如果严格避免别名是您的目标,您将不得不将数据复制到不同的对象。 有效,假设它们都具有相同的表示。