auto a = new int[0];
Berdasarkan [basic.compound.3] , nilai yang disimpan a
harus salah satu dari yang berikut:
- Pointer ke objek (tipe
int
)
- Pointer melewati ujung objek
- Batal
- Tidak valid
Kita dapat mengesampingkan kemungkinan pertama karena tidak ada objek bertipe int
dibangun. Kemungkinan ketiga dikesampingkan karena C ++ membutuhkan pointer non-null untuk dikembalikan (lihat [basic.stc.dynamic.allocation.2] ). Jadi kita dibiarkan dengan dua kemungkinan: sebuah pointer melewati ujung suatu objek atau sebuah pointer yang tidak valid.
Saya akan cenderung untuk melihat a
sebagai pointer masa lalu-akhir, tetapi saya tidak memiliki referensi yang memiliki reputasi untuk menetapkan itu. (Meskipun demikian, ada implikasi yang kuat dari ini di [basic.stc] , melihat bagaimana Anda dapat delete
pointer ini.) Jadi saya akan menghibur kedua kemungkinan dalam jawaban ini.
Di antara inisialisasi dan penghapusan salinan, apakah Anda diizinkan membaca pointer di a + 1
?
Perilaku tidak terdefinisi, seperti yang ditentukan oleh [expr.add.4] , terlepas dari kemungkinan yang dari atas berlaku.
Jika a
adalah pointer masa lalu, maka dianggap menunjuk ke elemen hipotetis pada indeks 0
array tanpa elemen. Menambahkan integer j
untuk a
didefinisikan hanya ketika 0≤0+j≤n
, di mana n
adalah ukuran array. Dalam kasus kami, n
adalah nol, sehingga jumlahnya a+j
didefinisikan hanya ketika j
adalah 0
. Secara khusus, menambahkan1
tidak ditentukan.
Jika a
tidak valid, maka kami dengan jelas jatuh ke dalam "Kalau tidak, perilaku tidak terdefinisi." (Tidak mengherankan, case yang didefinisikan hanya mencakup nilai pointer yang valid.)
Selanjutnya, apakah bahasa mengizinkan compiler untuk set a
ke nullptr
?
Tidak. Dari [basic.stc.dynamic.allocation.2] yang disebutkan di atas : "Jika permintaan berhasil, nilai yang dikembalikan oleh fungsi alokasi yang dapat diganti adalah nilai penunjuk yang bukan nol" . Ada juga catatan kaki yang menyebutkan bahwa C ++ (tetapi bukan C) membutuhkan pointer non-null sebagai respons terhadap permintaan nol.
a
dengan pasti (Anda tentu tidak bisa men-decere- nya).