auto a = new int[0];
Göre [basic.compound.3] , depolanan değeri a
aşağıdakilerden biri olmalıdır:
- Bir nesneye işaretçi (türünde
int
)
- Bir nesnenin sonunu geçen bir işaretçi
- Boş
- Geçersiz
Yapılmış tipte bir nesne olmadığı için ilk olasılığı göz ardı edebiliriz int
. Üçüncü olasılık, C ++ 'nın null olmayan bir işaretçi döndürülmesini gerektirdiği için reddedilir (bkz. [Basic.stc.dynamic.allocation.2] ). Böylece iki olasılık kalmıştır: bir nesnenin sonunu geçen bir işaretçi veya geçersiz bir işaretçi.
a
Son bir işaretçi olarak görmeye meyilli olurum, ancak bunu kesin olarak belirlemek için saygın bir referansım yok. (Bununla birlikte, [basic.stc] 'de , delete
bu işaretçiyi nasıl yapabileceğinizi gösteren güçlü bir ima vardır .) Bu yüzden bu cevapta her iki olasılığı da eğlendireceğim.
Kopya başlatma ve silme arasında, işaretçiyi adresinde okuyabilir misiniz a + 1
?
Yukarıdakilerden hangisinin geçerli olduğuna bakılmaksızın, [expr.add.4] tarafından dikte edildiği gibi, davranış tanımsızdır .
Eğer a
bir son-uç işareti, o zaman indeksinde varsayımsal elemanına noktasına kabul edilir 0
bir öğeye sahip olan bir dizi. Tamsayıyı ekleme j
için a
sadece tanımlanan 0≤0+j≤n
burada, n
dizi boyutudur. Bizim durumumuzda, n
sıfırdır, yani toplamı a+j
yalnızca tanımlanır j
olduğunu 0
. Özellikle, ekleme 1
tanımsızdır.
Eğer a
geçersiz, o zaman girer temiz bir şekilde "Aksi takdirde, davranış tanımlanmamış." (Beklenmedik bir şekilde, tanımlanan durumlar yalnızca geçerli işaretçi değerlerini kapsar.)
Ayrıca, dil derleyicinin ayarlanmasına izin a
veriyor nullptr
mu?
Hayır. Yukarıda belirtilen [basic.stc.dynamic.allocation.2] : "İstek başarılı olursa, değiştirilebilir bir ayırma işlevi tarafından döndürülen değer null olmayan bir işaretçi değeridir" . Ayrıca, C ++ 'ın (ancak C değil) sıfır talebine yanıt olarak null olmayan bir işaretçi gerektirdiğini söyleyen bir dipnot da vardır .
a
(kesinlikle dereference olamaz).