咬文嚼字一下。感觉啃pdf有点无聊了
一、
void比较特殊,是个incomplete type,而且不能成为complete type。
incomplete type没有"对齐要求"这一说法,所以printf("%u", alignof(void))这样的编译不过去。
C++ 17的"8.2.10 Reinterpret cast"这一节明确说了,只有满足这一节的第2到第11条的,才能显式使用reinterpret_cast。
不满足这几条的,到底是forbidden,还是unspecified behaviour,还是undefined behaviour,没明说。
由于void没有对齐的说法,所以reinterpret_cast<uint *>(void *)是不满足上述第2到第11条的。
而reinterpret_cast<short *>(int *)这种可以认为满足第7条,是OK的。
二、
static_cast是8.2.9节描述的,这一节的第13条对"void *"转换成"T *"有明确描述,如果不满足T的对齐要求,转换结果是unspecified。
三、
访问指针指向的内存,在"6.10 Lvalues and rvalues"这一节对glvalue的访问有描述。
第8条规定了8种情况,不符合这8种情况的,都属于undefined。
https://github.com/SuperCV/Book/blob/master/CXX/ISOIEC-14882-2017.pdf
【 在 hgoldfish 的大作中提到: 】
: 也就是说,从 c/cpp 标准看。。直接
: int64 load_int64(void *src) {
: return *static_cast<int*>(src);
: ...................
--
修改:z16166 FROM 114.241.227.*
FROM 114.241.227.*