Dengan standar baru datang (dan bagian sudah tersedia di beberapa kompiler), tipe baru std::unique_ptr
seharusnya menjadi pengganti std::auto_ptr
.
Apakah penggunaannya benar-benar tumpang tindih (sehingga saya dapat melakukan global menemukan / mengganti kode saya (bukan bahwa saya akan melakukan ini, tetapi jika saya melakukannya)) atau haruskah saya menyadari beberapa perbedaan yang tidak jelas dari membaca dokumentasi?
Juga jika itu adalah pengganti langsung, mengapa memberinya nama baru daripada hanya meningkatkan std::auto_ptr
?
sumber
std::auto_ptr
danstd::unique_ptr
tidak kompatibel di suatu tempat dan penurunan penggantian pada orang lain. Jadi, tidak ada temukan / ganti tidak cukup baik. Namun, setelah menemukan / mengganti bekerja melalui kesalahan kompilasi harus memperbaiki semuanya kecuali kasus sudut aneh. Sebagian besar kesalahan kompilasi akan membutuhkan penambahan astd::move
.100% kompatibel, selama Anda tidak meneruskannya dengan nilai ke fungsi lain.
tidak 100% kompatibel tetapi 99% kompatibel tampaknya tidak salah.
100% kompatibel dengan satu peringatan,
unique_ptr
s harus dilewati melaluistd::move
panggilan. Yang ini sederhana karena kompiler akan mengeluh jika Anda tidak melakukannya dengan benar.100% kompatibel.
Yang ini rumit.
std::auto_ptr
Semantik salinan itu jahat. Jika kelas tidak mengizinkan penyalinan makastd::unique_ptr
ada setetes penggantian. Namun, jika Anda mencoba memberikan semantik salinan kelas yang wajar, Anda perlu mengubahstd::auto_ptr
kode penanganan. Ini sederhana karena kompiler akan mengeluh jika Anda tidak melakukannya dengan benar. Jika Anda mengizinkan penyalinan kelas denganstd::auto_ptr
anggota tanpa kode khusus, maka malulah Anda dan semoga sukses.Singkatnya,
std::unique_ptr
tidak terputusstd::auto_ptr
. Itu tidak diizinkan pada waktu kompilasi perilaku yang sering kesalahan saat menggunakan astd::auto_ptr
. Jadi jika Anda menggunakanstd::auto_ptr
dengan perawatan yang dibutuhkan, beralih kestd::unique_ptr
harus sederhana. Jika Anda mengandalkanstd::auto_ptr
perilaku aneh, Anda tetap harus memperbaiki kode Anda.sumber
AFAIK,
unique_ptr
bukan pengganti langsung. Kelemahan utama yang diperbaiki adalah pengalihan kepemilikan secara implisit.Di sisi lain,
unique_ptr
akan memiliki kemampuan yang sama sekali baru: mereka dapat disimpan dalam wadah.sumber
auto_ptr
tidak diperbolehkan.Herb Sutter memiliki penjelasan yang bagus tentang GotW # 89 :
Dengan kata lain, sementara pencarian dan penggantian global dapat "memecah" kode Anda untuk sementara waktu, Anda harus tetap melakukannya: Mungkin perlu waktu untuk memperbaiki kesalahan kompilasi, tetapi akan menghemat lebih banyak masalah dalam jangka panjang.
sumber