SORU
22 Temmuz 2011, Cuma


` ?: Garip kullanın` `typeid` kod

Üzerinde çalıştığım projelerden biri, bu kodu görüyorum

struct Base {
  virtual ~Base() { }
};

struct ClassX {
  bool isHoldingDerivedObj() const {
    return typeid(1 ? *m_basePtr : *m_basePtr) == typeid(Derived);
  }
  Base *m_basePtr;
};

Asla typeid Bu şekilde gördüm. Neden ?: yerine sadece typeid(*m_basePtr) yapıyor o garip dans mı? Herhangi bir sebebi olabilir mi? Base edilmiş bir sınıf (sanal bir yıkıcı olan).

EDİT: bu kodu başka bir yerde, bunu görüyorum ve benzer görünüyor"" . gereksiz

template<typename T> T &nonnull(T &t) { return t; }

struct ClassY {
  bool isHoldingDerivedObj() const {
    return typeid(nonnull(*m_basePtr)) == typeid(Derived);
  }
  Base *m_basePtr;
};

CEVAP
26 EYLÜL 2011, PAZARTESİ


Sanırımbir optimizasyon! Biraz bilinen nadir (denebilir "hiçbir zaman") typeid kullanılan özellik typeid bağımsız değişkeni null bir başvuru zamanki İK yerine bir istisna atar.

Ne? Ciddi misin? Sarhoş musun?

Gerçekten. Evet. Hayır.

int *p = 0;
*p; // UB
typeid (*p); // throws

Evet, bu çirkin, hatta dil çirkinlik C standardı tarafından.

OTOH, bu herhangi bir yerde çalışmıyoriçindetypeid herhangi bir yığılmayı bu iptal edecektir ekleyerek çok argüman"": . özelliği

int *p = 0;
typeid(1 ? *p : *p); // UB
typeid(identity(*p)); // UB

Kayıt için: bir işaretçi bir başvuru yapmadan önce boş olduğunu otomatik derleyici tarafından kontrol mutlaka çılgın bir şey bu iletide iddia eden ben değilim. Sadece başvuru typeid, hemen tartışma olduğunda bu şekilde kontrol edeyim diyorumbaşka yerde değiltamamen çılgınlık. (Belki bir şaka bazı proje dosyaları, ve hiç ayrılmaz.)

Kayıt için: değilim iddia eden bir önceki "rekor" bu mantıklı için derleyici Ekle otomatik kontrol eden bir işaretçi boş değil, ve İçin için bir istisna atar (Java) ne zaman bir null başvuru yapıldı: genel, atma bir istisna üzerinde bir null başvuru (bu çok saçma. Bu özel bir durum yardımcı olmayacaktır bu yüzden bir programlama hatası. Bir onaylama işlemi hatası denir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AceHoodVEVO

    AceHoodVEVO

    12 Mayıs 2009
  • Brendan van Son

    Brendan van

    5 Aralık 2006
  • CaptainDisillusion

    CaptainDisil

    18 EYLÜL 2007