2009-01-19 20 views
53

++ aşağıdaki kod derleyici hata veriyor olur:Yokediciler (Char vb int, ..) C

typedef int myint; 

void destruct2 (myint * item) 
{ 
    item->~myint(); 
} 

İkinci kod neden çalışıyor? Bir int, sadece yazıldığından dolayı bir yıkıcı alır mı?

Bunu neden yapmak istediğini merak ediyorsanız: Bu, C++ kodunun yeniden düzenlenmesiyle ilgilidir. Standart yığını kaldırıyor ve kendinden yapay havuzlarla değiştiriyoruz. Bu, yeni yerleşimi ve yıkıcıları aramamızı gerektirir. İlkel türler için yıkıcıları çağırmanın yararsız olduğunu biliyorum, ancak yine de POD'ları gerçek sınıflarla değiştirmemiz durumunda bunların kodda olmasını istiyoruz.

Çıplak int'nin işe yaramadığını, ancak yazılanların yaptıklarını öğrenmek oldukça sürpriz oldu.

BTW - Şablon işlevlerini içeren bir çözüm var. Sadece şablonun içine yazdık ve her şey yolunda.

cevap

77

Kodunuzun genel parametreler için çalışmasını sağlayan nedendir. Bir kapsayıcı C:

Gömülü tipler için özel durumları tanıtmak can sıkıcı olur. Yani C++, int'a eşit olsa bile, yukarıdakileri yapmanıza izin verir. Kutsal Standart 12.4 p15 diyor:

The notation for explicit call of a destructor can be used for any scalar type name. Allowing this makes it possible to write code without having to know if a destructor exists for a given type.

düz int ve bir typedef'ed int kullanarak arasındaki fark sözdizimsel farklı şeyler olduğudur. Kural, bir yıkıcı aramada, ~'dan sonraki şey bir tür ismidir. int böyle bir şey değil, ama bir typed-adıdır. 7.1.5.2'a bakın. "Kutsal Standart" için

+13
+0

Sanırım bu, std :: is_destructible öğesini eski derleyicilerde tutarsız kılar (2012-2014) – GameDeveloper

+0

Bu cevabı yeterince oylayamıyorum! – Nils