Saat membuat variabel lokal, apakah benar digunakan (const) auto&
atau auto
?
misalnya:
SomeClass object;
const auto result = object.SomeMethod();
atau const auto& result = object.SomeMethod();
Di mana SomeMethod () mengembalikan nilai non-primitif - mungkin tipe lain yang ditentukan pengguna. Pemahaman saya const auto& result
adalah benar karena hasil yang dikembalikan oleh SomeMethod () akan memanggil konstruktor salinan untuk jenis yang dikembalikan. Tolong koreksi saya jika saya salah.
Bagaimana dengan tipe primitif? Saya anggap const auto sum = 1 + 2;
benar.
Apakah ini juga berlaku untuk loop berdasarkan loop?
for(const auto& object : objects)
auto
kerjanya (kecuali untuk kasus khususinitializer_list
s, yaitu non-deduced dalam konteks template), laluauto
ketik deduction.Jawaban:
auto
danauto &&
mencakup sebagian besar kasus:Gunakan
auto
saat Anda membutuhkan salinan lokal. Ini tidak akan pernah menghasilkan referensi. Konstruktor salin (atau pindahkan) harus ada, tetapi mungkin tidak dipanggil, karena pengoptimalan penghapusan salinan .Gunakan
auto &&
saat Anda tidak peduli apakah benda tersebut lokal atau bukan. Secara teknis, ini akan selalu menghasilkan referensi, tetapi jika penginisialisasinya bersifat sementara (mis., Fungsi dikembalikan berdasarkan nilai), pada dasarnya akan berperilaku seperti objek lokal Anda sendiri.Selain itu,
auto &&
tidak menjamin bahwa objek juga dapat dimodifikasi. Diberikan sebuahconst
objek atau referensi, itu akan menyimpulkanconst
. Namun, modifiabilitas sering diasumsikan, mengingat konteks spesifiknya.auto &
danauto const &
sedikit lebih spesifik:auto &
menjamin bahwa Anda membagikan variabel dengan sesuatu yang lain. Itu selalu menjadi referensi dan tidak pernah bersifat sementara.auto const &
seperti ituauto &&
, tetapi menyediakan akses hanya-baca.Tidak ada perbedaan.
Iya. Menerapkan prinsip di atas,
auto &&
untuk kemampuan mengubah dan membuang nilai urutan dalam loop. (Artinya, kecuali penampung menyediakan tampilan hanya-baca, sepertistd::initializer_list
, dalam hal ini akan secara efektif menjadiauto const &
.)auto &
untuk mengubah nilai urutan dengan cara yang berarti.auto const &
untuk akses hanya baca.auto
untuk bekerja dengan salinan (dapat dimodifikasi).Anda juga menyebutkan
auto const
tanpa referensi. Ini berfungsi, tetapi tidak terlalu umum digunakan karena jarang ada keuntungan dari akses hanya-baca ke sesuatu yang sudah Anda miliki.sumber
auto&
sepertinya menjadi pilihan yang baik. Tapi gunakanconst auto&
saat Anda ingin menambahkan konstanta yang belum ada.auto&&
adalah untuk penerusan, yang menurut saya terjadi lebih sering daripada yang diperkirakan Sutter. Misalnya, Anda mungkin ingin menyimpan nilai kembaliauto&&
dan kemudian "meneruskan" ke dua hal, seperti std :: cout untuk melihat nilai untuk debugging dan juga meneruskannya ke beberapa fungsi lain. Saya biasa menggunakan auto && lebih sering tetapi pernah digigit olehnya sekali atau dua kali ketika melakukan beberapa hal yang tidak terduga. Saya berharap saya lebih memperhatikan apa yang salah!auto&&
ini terkait dari fitur bahasa yang hilang, yang harus memungkinkan pernyataan apapun untuk dibagi ke dalam laporan yang lebih kecil. Bagian yang hilang adalah perpanjangan seumur hidup ... Saya berusaha keras untuk memperbaikinya tetapi tidak ada yang memperhatikan. Jangan menaruh terlalu banyak saham dalam punditry :)Ya, itu benar untuk digunakan
auto
danauto&
untuk variabel lokal. Saat mendapatkan tipe kembalian dari suatu fungsi, itu juga benar untuk digunakanauto&
. Ini juga berlaku untuk loop berbasis loop.Aturan umum untuk penggunaan
auto
adalah:auto x
kapan Anda ingin mengerjakan salinan.auto &x
kapan Anda ingin bekerja dengan item asli dan dapat memodifikasinya.auto const &x
kapan Anda ingin bekerja dengan item asli dan tidak akan memodifikasinya.Anda dapat membaca lebih lanjut tentang penentu otomatis di sini .
sumber
auto
menggunakan mekanisme yang sama dari jenis deduksi sebagai template, satu-satunya pengecualian yang saya sadari adalah bahwa daftar brace-init, yang disimpulkan olehauto
asstd::initializer_list
, tetapi tidak disimpulkan dalam konteks template.auto x = expression;
bekerja dengan terlebih dahulu menghapus semua referensi dan kualifikasi cv dari jenis ekspresi sisi kanan, lalu mencocokkan jenisnya. Misalnya, jika Anda memiliki
const int& f(){...}
kemudianauto x = f();
menyimpulkanx
sebagaiint
, dan tidakconst int&
.Bentuk lainnya,
auto& x = expression
tidak menghapus kualifikasi cv, jadi, dengan menggunakan contoh di atas,
auto& x = f()
menyimpulkanx
sebagaiconst int&
. Kombinasi lainnya hanya menambahkan kualifikasi cv.Jika Anda ingin tipe Anda selalu disimpulkan dengan kualifikasi cv-ref, gunakan infamous
decltype(auto)
di C ++ 14, yang menggunakandecltype
aturan pengurangan tipe.Jadi singkatnya kalau mau copy pakai
auto
. Kalau mau referensinya pakaiauto&
. Gunakanconst
kapan pun Anda menginginkan tambahanconst
-ness.EDIT Ada kasus penggunaan tambahan,
auto&& x = expression;
yang menggunakan aturan referensi-menciutkan, sama seperti dalam kasus referensi penerusan dalam kode template. Jika
expression
adalah nilai l, makax
adalah referensi nilai l dengan kualifikasi cv dariexpression
. Jikaexpression
rvalue, makax
rvalue referensi.sumber
rvalues
. Apakah ada cara pengujian yang sederhana? Dan bagaimana Anda bisa memiliki nilai r yang memenuhi syarat cv? On function return cv akan dibuang.auto && x = std::move< const int >( 5 );
akan mendeklarasikanint const && x
, meskipun jarang digunakan.Iya. Auto tidak lebih dari tipe deduksi kompiler, jadi gunakan referensi di mana Anda biasanya menggunakan referensi, dan salinan lokal (otomatis) di mana Anda biasanya menggunakan salinan lokal. Apakah referensi akan digunakan atau tidak terlepas dari pengurangan jenis.
Hukum? Ya, dengan const tersebut. Praktek terbaik? Mungkin tidak, tidak. Setidaknya, tidak dengan C ++ 11. Terutama, jika nilai yang dikembalikan dari SomeMethod () sudah bersifat sementara. Anda ingin mempelajari semantik pemindahan C ++ 11, penghapusan salinan, dan pengoptimalan nilai pengembalian: https://juanchopanzacpp.wordpress.com/2014/05/11/want-speed-dont-always-pass-by- nilai/
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=199
https://isocpp.org/wiki/faq/ctors#return-by-value-optimization
Ya, ini bagus.
Ya, ini juga bagus. Saya menulis kode semacam ini di tempat kerja sepanjang waktu.
sumber