假设我有以下代码:
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)
提供存储的*p
无符号字符数组的指针,那么C ++标准的[expr.add]部分意味着{{ 1}}是未定义的行为(UB)。否则,如果编译器必须假定b+2*sizeof(int)
也是指向为b
提供存储的unsigned char数组的指针,那么它不是UB。
标准中指出编译器必须假设*p
是指向b
的存储unsigned char[3*sizeof(int)]
的指针?
答案 0 :(得分:1)
根据[expr.static.cast]:
类型为“指向cv1 void的指针”的prvalue可以转换为类型为“指向cv2 T的指针”的prvalue,其中T是 对象类型和cv2是相同的cv-qualification,或者比cv1更高的cv资格。如果是原件 指针值表示内存中字节的地址A,A不满足对齐要求 然后,结果指针值未指定。否则,如果原始指针值指向一个 对象a,并且有一个类型为T的对象b(忽略cv-qualification),它是指针可互换的(6.9.2) 使用a,结果是指向b的指针。否则,指针值不会因转换而改变。
根据[expr.reinterpret.cast]:
可以将对象指针显式转换为不同类型的对象指针。当一个prvalue v 对象指针类型被转换为对象指针类型“指向cv T的指针”,结果是static_cast(static_cast(v))。
所以我假设b指向三个unsigned char数组的元素。