2011-06-07 19 views
5

nullptr'un derleyici desteğini beklemekten yoruldum (gcc 4.6 does ancak yeni dağıtımlar bunu destekliyor).Mükemmel nullptr öykünür

nullptr tamamen desteklenene kadar bir durma boşluğu olarak öykünmeye karar verdim. İki emülasyon örneği vardır: biri here ve bir tanesi wikibooks.

Not, hiçbir uygulamada operator == belirtilmez. Ancak, bir, aşağıdaki kod will not compile.

int* ptr = nullptr; 
assert(ptr == nullptr); // error here: missing operator == 

Bu operator == hatası derleyici bir hata mı?
nullptr (!=, <, <=, vb.) nullptr'yi daha iyi taklit etmek için gerekli mi?
Öykünülmüş bir nullptr ile gerçek anlaşma arasındaki fark nedir?

+2

Neden bunu yerine "assert (ptr);" yerine yerine yaparsın? – ildjarn

+0

@Neil Butterworth: Bu doğru değil. 'nullptr' Standard'ın bir parçası olmalı çünkü sadece herkesin aynı boş gösterici türünü kullandığı bir değer var; std :: nullptr_t'. Herkes kendi null işaretçisini uyguladıysa, boş göstericiyi kabul edecek bir işlev nasıl yazardınız? Boş gösterici türünün ne olduğunu bilmiyorsunuz. – Puppy

+0

@ildjarn: Kodu temizlemek için bir onaylama kullandım. Benim asıl örneğim, eşitlik operatörünü kullanan std :: remove (v.begin(), v.end(), nullptr). Ve sadece kullanmamın nedeni std :: remove_if' istemiyorum. Sadece gerçek nullptr gibi çalışmasını istiyorum. –

cevap

2

Sen bilinmeyen bir nedenle başarısız C++ 0x derleyicisi ile derlenmiştir. compiles fine in C++03.

+0

Yani, orijinal soruma geri dönün. Bu hata yeni C++ 0x dil kurallarının bir etkisi mi? Yoksa diğer C++ 0x özellikleri eklendiğinde gcc'ye girilen bir hata mı? –

+2

@deft_code: 1) kodunuz geçersiz C++ 0x çünkü nullptr anahtar sözcüğünü kullanıyor. 2)% 90 eminim bir GCC hatası 3) zaten bir benzer hata vardı (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33990). – ybungalobill

+0

Bu hatayla harika bul. [Tam hata durumum] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33990#c4) yorumlarda listelenir. 1. noktaya yanıt olarak, _no duh demek zorundayım! _ Tamamen uyumlu bir C++ 0x derleyicide açıkça geçersiz. gcc 4.5 henüz tam olarak uyumlu değil ve dolayısıyla bir anahtar kelimeyi taklit etme ihtiyacım var. –

1

Evet, böyle bir şeyi uygulamalısınız. Ancak, örtük dönüştürme operatörlerinin tekmelemediğine ve açık bir operatör sağlamadan karşılaştırmanıza izin vermediğine şaşırdım.

template<typename T> bool operator==(T* ptr, nullptr_t null) { 
    return ptr == 0; 
} 
template<typename C, typename R> bool operator==(R C::* ptr, nullptr_t null) { 
    return ptr == 0; 
} 
// And the reverse 
Aslında ilk örneği referans resmi teklifte bahsetmişti
1

: birkaç popüler mevcut derleyiciler ile

Deney bunun birkaç zayıf ve/veya yanıltıcı derleyici teşhis üretir olduğunu göstermektedir ortak kullanım örnekleri bölüm 2'de tarif edildiği gibi (örnek olarak: Kat "için“int "“den herhangi bir dönüşüm””; “den herhangi bir uygun dönüştürme fonksiyonu“sabit 'ila' sınıflaması ' var ”; “Bir şablon argümanı adlandırılmamış bir türe referans olmayabilir”; “Hayır operatör“== "bu işlemsellere maçları, işlenen türleri şunlardır: int == const sınıfı ”) Biz derleyiciler hala için quality teşhislerinde tikler sağlamak amacıyla yılında nullptr arasında özel bilgi eklemek gerekir inanıyoruz. yaygın kullanım durumları.

Derleyici henüz gelmediyse, bu boşluğu kendiniz doldurmalısınız.

+0

Bu zayıf derleyici tanılama tartışması, adlandırılmamış bir "nullptr" türüne başvurmaktır. Ancak, standartlar komitesi 'nullptr''nin nullptr_t' türüne sahip olduğuna karar verdi.Nullptr sınıfı 'nullptr_t' olduğunda bu şifreli hata mesajlarının hepsi çok daha iyi olur. –

+0

@deft_code - Peki o zaman sorun nedir? – littleadv