Yasallığına benzer şekilde delete this
, this
bildiğim kadarıyla yeni yerleşime de izin verilir. Ayrıca, this
daha sonra mevcut olan diğer işaretçilerin / referansların kullanılıp kullanılamayacağı konusunda birkaç kısıtlama vardır:
[Basic.life]
Bir nesnenin ömrü sona erdikten sonra ve işgal edilen nesnenin yeniden kullanılmasından veya serbest bırakılmasından önce, orijinal nesnenin bulunduğu depolama konumunda yeni bir nesne oluşturulur, orijinal nesneye işaret eden bir işaretçi, orijinal nesneye atıfta bulunulursa veya orijinal nesnenin adı otomatik olarak yeni nesneye işaret eder ve yeni nesnenin ömrü başladıktan sonra yeni nesneyi değiştirmek için kullanılabilir:
- yeni nesnenin saklanması, orijinal nesnenin kapladığı saklama yerini tam olarak kaplar ve
- yeni nesne orijinal nesne ile aynı türdedir (üst düzey cv niteleyicileri yoksayılır) ve
- orijinal nesnenin türü sabit değil ve bir sınıf türü, türü sabit olan veya başvuru türü olan statik olmayan bir veri üyesi içermiyorsa ve
- ne orijinal nesne ne de yeni nesne potansiyel olarak çakışan bir alt nesne değildir ([intro.object]).
İlk ikisi bu örnekten memnun, ancak son ikisinin dikkate alınması gerekecek.
Üçüncü nokta ile ilgili olarak, işlevin const-nitelikli olmadığı göz önüne alındığında, orijinal nesnenin const olmadığını varsaymak oldukça güvenli olmalıdır. Sabitlik kaldırılmışsa arıza arayan tarafındadır. Const / başvuru üyesi ile ilgili olarak, bu atanabilir olduğunu iddia ederek kontrol edilebilir düşünüyorum:
static_assert(std::is_trivial_v<A> && std::is_copy_assignable_v<A>);
Tabii ki, atanabilirlik bir gereklilik olduğundan, bunun yerine sadece *this = {};
aynı programı üretmeyi bekleyebileceğim kullanabilirsiniz. Belki de daha ilginç bir kullanım durumu *this
, başka türdeki bir nesnenin hafızasını yeniden kullanmak olabilir ( this
en azından yeniden yorumlama + aklama olmadan kullanım gereksinimlerini ortadan kaldıracaktır ).
Benzer şekilde delete this
, yeni yerleşim this
, "güvenli" olarak tanımlanamaz.