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