auto a = new int[0];
[basic.compound.3]によると、格納される値a
は次のいずれかである必要があります:
- (型の
int
)オブジェクトへのポインタ
- オブジェクトの終わりを過ぎたポインタ
- ヌル
- 無効
int
構築されたタイプのオブジェクトがなかったので、最初の可能性を除外できます。C ++ではnull以外のポインターを返す必要があるため、3番目の可能性は除外されます([basic.stc.dynamic.allocation.2]を参照)。したがって、2つの可能性があります。オブジェクトの終わりを過ぎたポインタまたは無効なポインタです。
私はa
過去の終わりのポインタと見なす傾向がありますが、それを明確に確立する信頼できるリファレンスはありません。(ただし、これは[basic.stc]で強く示唆されており、どのようにしてdelete
このポインターを使用できるかがわかります。)したがって、この回答では両方の可能性について説明します。
コピーの初期化から削除までの間に、ポインタを読み取ることができますa + 1
か?
[expr.add.4]で示されているように、上記のどの可能性が適用されるかに関係なく、動作は未定義です。
場合a
過去エンドポインタである、それはインデックスで仮説の要素を指すように考えられて0
ない要素を持つ配列の。j
への整数の追加は、が配列のサイズであるa
場合0≤0+j≤n
にのみ定義されn
ます。我々の場合には、n
その合計は、ゼロであるa+j
ときにのみ定義されてj
います0
。特に、追加1
は未定義です。
a
が無効な場合は、「それ以外の場合、動作は未定義」に完全に分類されます。(当然のことながら、定義されているケースは有効なポインター値のみをカバーしています。)
さらに、この言語では、コンパイラーをに設定a
できnullptr
ますか?
いいえ。上記の[basic.stc.dynamic.allocation.2]から:「リクエストが成功した場合、置き換え可能な割り当て関数によって返される値はnull以外のポインタ値です。」C ++(ただしCではない)がゼロ要求に応答してnull以外のポインターを必要とすることを示す脚注もあります。
a
確かに読むことができます(確かにそれを逆参照することはできません)。