C ++(和C)严格别名规则包括char*
和unsigned char*
可以为任何其他指针设置别名。
AFAIK uint8_t*
没有类似的规则。
因此我的问题是:std::byte
指针的别名规则是什么?
C ++参考目前只是specifies:
与字符类型(char,unsigned char,signed char)类似,它可用于访问其他对象占用的原始内存(对象表示),但与这些类型不同,它不是字符类型,也不是算术类型。
答案 0 :(得分:19)
从目前的标准草案([basic.types] / 2):
对于任何简单的对象(基类子对象除外) 可复制类型T,无论对象是否包含有效的类型值 T,构成对象的底层字节([intro.memory])可以是 复制到 char,unsigned char或std :: byte 的数组中 ([cstddef.syn])。 43 如果将该数组的内容复制回 对象,该对象随后应保持其原始值。
所以是的,相同的别名规则适用于这三种类型,就像cppreference总结一样。
提及([basic.lval] /8.8)可能也很有价值:
如果程序试图通过访问对象的存储值 行为是除以下类型之一以外的glvalue 未定义:
- char,unsigned char或std :: byte type。