2013-02-14 24 views
6

unique_ptr<char[]> ürününü unique_ptr<const char[]> ürününe taşımak için en iyi deyim nedir?unique_ptr <char[]> için unique_ptr <const char []>

Kullanım örneği: bazı arabellekte bir C dizesi oluşturduğunuzu varsayalım. Bir istisna durumunda düzgün temizleme sağlamak için, bu tampon bir unique_ptr kullanarak referans olabilir. Dize oluşturulduktan sonra, dizede daha fazla değişiklik yapılmasını önlemek için unique_ptr<const char[]> bildirilen bazı sınıf üyelerine taşımak isteyebilirsiniz.

std::unique_ptr<const char[]> res; 
std::unique_ptr<char[]> buf(new char[4]); 
buf[0] = 'f'; 
buf[1] = buf[2] = 'o'; 
buf[3] = '\0'; 
res = std::unique_ptr<const char[]>(const_cast<const char*>(buf.release())); 

Basitçe görünmüyor hareketli muhtemelen farklı deleter türlerine, çalışmak için: Burada

var bugüne kadar en iyisidir. Hatta Should `unique_ptr< T const [] >` accept a `T*` constructor argument?

tartışıldığı üzere yukarıda özetlenen neyi başarmak için daha iyi bir deyim var mı, çalışmaz const char için char den açık döküm atlayarak? Kodum oldukça hantal ve oldukça uzun görünüyor, konseptin ilk bakışta ne kadar basit olduğu düşünülüyor.

+0

sadece 'res = std :: hamle (buf) kullanarak;' benim için iyi derler VS2010 ve VS2012 ve Clang trunk (libC++ trunk ile). Ancak GCC 4.7.2 üzerinde boğuldu. – Xeo

+1

GCC 4.8 trunk sorunu düzelmiş gibi görünüyor ve 'res = std :: move (buf)' 'da kullanabilirsiniz. Aksi halde, bu aldatmacanın etrafında dolaşabileceğini sanmıyorum. Satırı kısaltmak için 'res.reset (const_cast (buf.release())); ', yine de. – Xeo

+0

@ Xeo, hem GCC 4.8'deki bilgiler hem de 'reset' kullanılarak daha kısa olan deyim çok değerlidir. Lütfen cevap olarak gönderin. – MvG

cevap

6

VS2010 ve VS2012'nin stdlib'si, bir uzantı olarak ve DR2118 yanıt olarak res = std::move(buf) ile dönüştürmeye izin verir. Aynı libC++ ve GCC 4.8'in libstdC++ için de geçerli. GCC 4.7 için

, sen const_cast etrafında almazsınız, ama en az sen biraz çizgi kısaltabilirsiniz:

res.reset(const_cast<char const*>(buf.release())); 
İlgili konular