让我们假设我有以下代码:
int* p = new (new unsigned char[3*sizeof(int)]) int{};
unsigned char* b = reinterpret_cast<unsigned char*>(p);
auto b2 = b + 2*sizeof(int);//it is UB if compilers do not assume that
//b is pointer to an unsigned char[3*sizeof(int)]
int* p2 = new (b2) int{};
b
不是指向3*sizeof(int)
Unsigned Char数组的指针,它为*p
提供了存储,则C 标准的部分[Expr.Add]表示b+2*sizeof(int)
是未定义的行为(UB)。否则,如果编译器必须假设b
也是指向无符号字符数组的指针,该数组提供了*p
的存储空间,那么它不是UB。
因此,是否在标准中指定了编译器必须假设b
是unsigned char[3*sizeof(int)]
的指针,该指针为*p
?
根据[expr.static.cast]:
类型"指向CV1 void"类型 对象类型和CV2与CV1相同或更大的CV资格。如果原来 指针值表示内存中一个字节的地址a,并且A不满足对齐要求 t,然后未指定结果指针值。否则,如果原始指针值指向 对象A,并且有一个t型的对象B(忽略CV-qualification),它是指指相关的(6.9.2) 在a中,结果是指向b的指针。否则,指针值不变。
根据[Expr.Reinterpret.cast]:
可以将对象指针明确转换为其他类型的对象指针。当prvalue v 对象指针类型转换为对象指针类型"指向cv t",结果是static_cast(static_cast(v))。
所以我想b指向三个无符号字符的数组的元素。