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

  • BiGSH0TROB

    BiGSH0TROB

    7 NİSAN 2011
  • bombjack2991

    bombjack2991

    29 HAZİRAN 2008
  • Lancome USA

    Lancome USA

    30 HAZİRAN 2009