での私は、次のコードを持っていると仮定してみよう:オブジェクト表現の要素へのポインタまたは提供された記憶域の要素へのポインタ?
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)
unsigned char型の配列へのポインタでない場合、[expr.add] C++標準のセクションがあることを意味しますb+2*sizeof(int)
は未定義の動作(UB)です。そうでない場合、コンパイラはb
も、*p
のためのストレージを提供するunsigned charの配列へのポインタであると想定しなければならない場合、UBではありません。
したがって、b
は、*p
のストレージを提供するunsigned char[3*sizeof(int)]
へのポインタであるとコンパイラが想定している必要がありますか? 【expr.static.cast]によれば