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.
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
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
@ 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