【问题标题】:Pointer to element of object representation or pointer to an element of the provided storage?指向对象表示元素的指针还是指向所提供存储元素的指针?
【发布时间】:2017-09-03 08:25:08
【问题描述】:

假设我有以下代码:

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 不是指向为*p 提供存储的3*sizeof(int) 无符号字符数组的指针,则C++ 标准的[expr.add] 部分暗示b+2*sizeof(int) 是未定义的行为(UB )。否则,如果编译器必须假定 b 也是指向为 *p 提供存储的 unsigned char 数组的指针,则它不是 UB。

那么标准中是否规定编译器必须假定b 是指向为*p 提供存储的unsigned char[3*sizeof(int)] 的指针?

【问题讨论】:

    标签: c++ pointers language-lawyer


    【解决方案1】:

    根据[expr.static.cast]:

    “指向 cv1 void 的指针”类型的纯右值可以转换为“指向 cv2 T 的指针”类型的纯右值,其中 T 为 对象类型和 cv2 与 cv1 具有相同的 cv 限定或更高的 cv 限定。如果是原 指针值表示内存中一个字节的地址A,A不满足对齐要求 的 T,则结果指针值未指定。否则,如果原始指针值指向 对象 a,并且有一个类型为 T(忽略 cv 限定)的对象 b 是指针可互转换的(6.9.2) 对于 a,结果是指向 b 的指针。否则,指针值不会因转换而改变。

    根据[expr.reinterpret.cast]:

    对象指针可以显式转换为不同类型的对象指针。当一个prvalue v 对象指针类型转换为对象指针类型“pointer to cv T”,结果为static_cast(static_cast(v))。

    所以我假设 b 指向三个 unsigned char 数组中的一个元素。

    【讨论】:

      猜你喜欢
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多