2017-09-03 9 views
3

での私は、次のコードを持っていると仮定してみよう:オブジェクト表現の要素へのポインタまたは提供された記憶域の要素へのポインタ?

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]によれば

答えて

1

「CV1ボイドへのポインタ」型のprvalueは、Tは ある「CV2のTへのポインタ」型のprvalue、に変換することができますcv2はcv1と同じcv-qualification、またはcv1よりも大きいcv-qualificationです。元の ポインタ値がメモリ内のバイトのアドレスAを表し、AがTのアラインメント要件 を満たさない場合、結果のポインタ値は指定されません。それ以外の場合、元のポインタ値が オブジェクトaを指し、ポインタ交換可能な(6.9.2) のa型のオブジェクト型b(cv修飾を無視する)がある場合、結果はbへのポインタになります。それ以外の場合、ポインタ値は変換によって変更されません。 【expr.reinterpret.cast]によれば

オブジェクトポインタは、明示的に異なるタイプのオブジェクトポインタに変換することができます。 オブジェクトポインタ型のprvalue vがオブジェクトポインタ型 "cv Tへのポインタ"に変換されると、結果はstatic_cast(static_cast(v))になります。

したがって、bは3つのunsigned charの配列の要素を指しているとします。

関連する問題