2012-06-02 33 views
5

Biri gcc 4.5.3 kullanan ve diğeri gcc 4.6.3'e taşınan iki farklı son kullanıcı ile bir kütüphanede çalışıyorum. Kütüphane yeni C++ 11 akıllı işaretçileri (özellikle unique_ptr) kullanır ve gcc 4.5.3'te iyi derler. Ancak, bu iki sürüm arasında gcc, nullptr'yi desteklemeye başladı, böylece unique_ptr API'si standardı daha yakından eşleştirmek için değiştirildi. Şimdi Bunu yaparken aşağıdaki kod temiz (yani., bir sonraki cümle) var mı onunla ve nullptr olmadan hem çalışır, böylece yukarıda eğer ifadeyi değiştirmek için bir yol belirsizunique_ptr, nullptr ve destekleyici gcc 4.5.x ve 4.6.x

unique_ptr up(new int(30)); 
... 
if(up == 0) // ambiguous call now to unique_ptr(int) for 0 

ince gitti? Mümkün

#if defined NULLPOINTER_AVAILABLE 
    #define NULLPTR (nullptr) 
#else 
    #define NULLPTR (0) 
#endif 

if (çalışacağımı düşünüyorum) aşağıdaki gibi bir yapılandırmak çek ve sonra bir makro önlemek istiyorum ya bu ı arıyorum davranışı almak için tek yoldur?

cevap

3

Hangi hatalara rastladınız?

#include <iostream> 
#include <memory> 
int main() { 
using namespace std; 
unique_ptr<int> up(new int(30)); 
if (up == 0) 
    cout << "nullptr!\n"; 
else cout << "bam!\n"; 
} 

g++ -std=c++0x -Wall nullptr.cpp -o nullptr (GCC 4.6.2) ile birlikte iyi derler. Benzer bir kullanım (0 ile karşılaştırma) açık örneklerin birinde listelenen burada

Ayrıca nullptr ile Stroustrup ve Sutter tarafından N2431 kağıt geçmesi.

+0

Örneğinizin çalıştığını (ve bu sorunla ilgili sorun bildiriminde benimki) doğru olduğundan, aslında kullandığım türlerle ilgili bir şey olması gerekir ("int" kullanmam ancak templated sınıfı kullanmama). Gördüğüm şeye neden olan daha iyi bir örnek bulabilir miyim ve görmeyeceğim. – bpw1621

+0

@ bpw1621: Bunun gerçek türle ilgili bir şey olduğundan eminim. Onlar * MoveConstructible * ve * MoveAssignable *? Bunu, 'is_move_constructible' gibi uygun 'type_traits' üyeleriyle kontrol edebilirsiniz. – dirkgently

+0

Onlar da türlerse, bu muğlaklığa sebep oluyor mu? Ben düşünen aşırı yük setinde hareket ettiriciyi gördüm. – bpw1621