Membaca beberapa contoh loop berdasarkan rentang mereka menyarankan dua cara utama 1 , 2 , 3 , 4
std::vector<MyClass> vec;
for (auto &x : vec)
{
// x is a reference to an item of vec
// We can change vec's items by changing x
}
atau
for (auto x : vec)
{
// Value of x is copied from an item of vec
// We can not change vec's items by changing x
}
Baik.
Ketika kita tidak perlu mengganti vec
item, IMO, Contoh menyarankan untuk menggunakan versi kedua (berdasarkan nilai). Mengapa mereka tidak menyarankan sesuatu yang const
referensi (Setidaknya saya belum menemukan saran langsung):
for (auto const &x : vec) // <-- see const keyword
{
// x is a reference to an const item of vec
// We can not change vec's items by changing x
}
Bukankah ini lebih baik? Bukankah itu menghindari salinan yang berlebihan di setiap iterasi saat itu const
?
const auto &x
itu setara dengan pilihan ketiga Anda.auto&&
ketika Anda tidak ingin membuat salinan yang tidak perlu, dan tidak peduli apakah Anda memodifikasinya atau tidak, dan Anda hanya ingin bekerja.const
. Namun, apakah itu akanauto const &
, atauauto const
memiliki sedikit perbedaan. Saya memilihauto const &
hanya untuk lebih konsisten.Jika Anda memiliki
std::vector<int>
ataustd::vector<double>
, maka tidak apa-apa untuk digunakanauto
(dengan salinan nilai) alih-alihconst auto&
, karena menyalinint
atau adouble
adalah murah:Tetapi jika Anda memiliki
std::vector<MyClass>
, di manaMyClass
memiliki beberapa semantik salinan non-sepele (misalnyastd::string
, beberapa kelas kustom yang kompleks, dll) maka saya sarankan menggunakanconst auto&
untuk menghindari deep-copy :sumber
Lalu mereka memberikan saran yang salah.
Karena mereka memberikan saran yang salah :-) Apa yang Anda sebutkan itu benar. Jika Anda hanya ingin mengamati suatu objek, tidak perlu membuat salinan, dan tidak perlu memiliki non-
const
referensi untuk itu.EDIT:
Saya melihat referensi yang Anda tautkan semua memberikan contoh iterasi pada rentang
int
nilai atau beberapa tipe data fundamental lainnya. Dalam hal itu, karena menyalinint
tidak mahal, membuat salinan pada dasarnya setara dengan (jika tidak lebih efisien daripada) memiliki pengamatanconst &
.Namun, ini bukan kasus umum untuk tipe yang ditentukan pengguna. UDT mungkin mahal untuk disalin, dan jika Anda tidak memiliki alasan untuk membuat salinan (seperti memodifikasi objek yang diambil tanpa mengubah yang asli), maka lebih baik menggunakan a
const &
.sumber
Saya akan bertentangan di sini dan mengatakan tidak perlu
auto const &
dalam rentang berbasis loop. Beri tahu saya jika Anda menganggap fungsi berikut ini konyol (tidak sesuai tujuannya, tetapi dalam cara tertulisnya):Di sini, penulis telah membuat referensi const
v
untuk digunakan untuk semua operasi yang tidak memodifikasi v. Ini konyol, menurut pendapat saya, dan argumen yang sama dapat dibuat untuk digunakanauto const &
sebagai variabel dalam rentang yang didasarkan untuk loop, bukan hanyaauto &
.sumber
const_iterator
dalam for for loop? Bagaimana Anda memastikan bahwa Anda tidak mengubah item asli dari sebuah wadah ketika Anda mengulanginya?const_iterator
? Biarkan saya menebak, wadah yang Anda iterator berakhir, adalahconst
. Tapi mengapaconst
harus memulainya? Di suatu tempat Anda menggunakanconst
untuk memastikan apa?const
sama seperti keuntungan menggunakanprivate
/protected
di kelas. Ini menghindari kesalahan lebih lanjut.v
, implementasi IMO akan baik-baik saja. Dan jika loop tidak pernah memodifikasi objek yang dilaluinya, sepertinya benar bagi saya untuk memiliki referensiconst
. Saya mengerti maksud Anda. Milik saya adalah bahwa loop mewakili unit kode cukup banyak seperti fungsinya, dan dalam unit itu tidak ada instruksi yang perlu mengubah nilai. Oleh karena itu, Anda dapat "menandai" seluruh unit sebagaiconst
, seperti yang akan Anda lakukan denganconst
fungsi anggota.const &
untuk rentang berbasis konyol, karena Anda menulis contoh imajiner yang tidak relevan dari seorang programmer imajiner yang melakukan sesuatu yang konyol dengan cv- kualifikasi? ... OK kalau begitu