auto
menggunakan mekanisme yang sama dari jenis deduksi sebagai template, satu-satunya pengecualian yang saya sadari adalah bahwa daftar brace-init, yang disimpulkan oleh auto
as std::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(){...}
kemudian auto x = f();
menyimpulkan x
sebagai int
, dan tidak const int&
.
Bentuk lainnya,
auto& x = expression
tidak menghapus kualifikasi cv, jadi, dengan menggunakan contoh di atas, auto& x = f()
menyimpulkan x
sebagai const 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 menggunakan decltype
aturan pengurangan tipe.
Jadi singkatnya kalau mau copy pakai auto
. Kalau mau referensinya pakai auto&
. Gunakan const
kapan pun Anda menginginkan tambahan const
-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, maka x
adalah referensi nilai l dengan kualifikasi cv dari expression
. Jika expression
rvalue, maka x
rvalue referensi.
auto
kerjanya (kecuali untuk kasus khususinitializer_list
s, yaitu non-deduced dalam konteks template), laluauto
ketik deduction.