auto a = new int[0];
Berdasarkan [basic.compound.3] , nilai yang disimpan aharus 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 intdibangun. 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 asebagai 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 deletepointer 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 aadalah pointer masa lalu, maka dianggap menunjuk ke elemen hipotetis pada indeks 0array tanpa elemen. Menambahkan integer juntuk adidefinisikan hanya ketika 0≤0+j≤n, di mana nadalah ukuran array. Dalam kasus kami, nadalah nol, sehingga jumlahnya a+jdidefinisikan hanya ketika jadalah 0. Secara khusus, menambahkan1 tidak ditentukan.
Jika atidak 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 ake 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.
adengan pasti (Anda tentu tidak bisa men-decere- nya).