SORU
19 Ocak 2009, PAZARTESİ


Yerleşik tür yıkıcı (int, char vs..)

C aşağıdaki kodu derleyici bir hata veriyor:

void destruct1 (int * item)
{
  item->~int();
}

Bu kod neredeyse aynıdır, sadece başka bir türü için typedef int ve bir şey sihirli olur:

typedef int myint;

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

Neden ikinci kod çalışıyor mu? Bir int typedefed olmuştur diye bir yıkıcı olur mu?

Kimse bunu yapmak istiyor neden merak ediyorsun durumda: Bu C kodunu yeniden düzenleme geliyor. Standart yığın kaldırma ve selfmade havuzları ile yenileyeceğiz. Bu bizim yerleştirme-yeni ve yıkıcılar aramayı gerektirir. İlkel türler için yıkıcı araman işe yaramaz olduğunu biliyorum, ama biz gerçek sınıfları ile daha sonra yerine Bakla durumda kod yine de onları istiyoruz.

Çıplak int ama typedefed olanları mı işe yaramazsa bulmak oldukça sürpriz oldu.

Btw - şablon-fonksiyonları içeren bir çözüm buldum. Biz sadece şablon içinde typedef ve her şey yolunda.

CEVAP
19 Ocak 2009, PAZARTESİ


Kodunuzu genel parametreleri için iş yapar bu yüzden. Kap " C " göz önünde bulundurun:

template<typename T>
struct C {
    // ...
    ~C() {
        for(size_t i = 0; i<elements; i  )
            buffer[i].~T();
    }
};

Yerleşik türleri için özel durumlar tanıtmak için çok can sıkıcı olmalı. C T int eşit olursa bile yukarıdaki almasını sağlar. Kutsal Standart 12.4 p15 diyor ki:

Bir yıkıcı için açık çağrı gösterimde herhangi bir skaler türü adı için kullanılabilir. Bu izin, mümkünse bir yıkıcı belirli bir tip varsa bilmek zorunda kalmadan kod yazmak için yapar.

Düz bir int ve çiğnenmiş bir typedef int kullanmak arasındaki fark sözdizimsel olarak farklı şeyler olmasıdır. Kural yıkıcı bir çağrı, ~ sonra şey tür adı. int böyle bir şey yok, ama typedef adı. 7.1.5.2 bak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Michael Neal

    Michael Neal

    2 Mayıs 2009
  • Phymec

    Phymec

    18 Temmuz 2009
  • TechRax

    TechRax

    21 EYLÜL 2009