指向对象表示元素的指针或指向所提供存储的元素的指针?

时间:2017-09-03 08:25:09

标签: c++ pointers language-lawyer

假设我有以下代码:

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)]的指针?

1 个答案:

答案 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数组的元素。

相关问题