C++(和 C)严格的别名规则包括
char*
和 unsigned char*
可以为任何其他指针起别名。
据我所知,
uint8_t*
没有类似的规则。
std::byte
指针的别名规则是什么?
C++ 参考目前仅指定:
与字符类型(char、unsigned char、signed char)一样,它可用于访问其他对象(对象表示)占用的原始内存,但与这些类型不同,它不是字符类型,也不是算术类型。
来自当前标准草案([basic.types.general]/2):
对于普通可复制类型
的任何对象(潜在重叠的子对象除外),无论该对象是否持有类型T
的有效值,底层字节 ([intro.memory]) 构成可以将该对象复制到T
、char
或unsigned char
([cstddef.syn]) 数组中。 如果该数组的内容被复制回对象中,则该对象随后应保留其原始值。std::byte
所以,是的,相同的别名规则适用于这三种类型,正如 cppreference 总结的那样。
值得一提的是([basic.lval]/11):
如果程序尝试通过类型与以下类型之一不相似的泛左值访问对象的存储值,则行为未定义:44
- [...]
- a
、char
或unsigned char
类型。std::byte
44 此列表的目的是指定对象可以或不可以使用别名的情况。