automenggunakan mekanisme yang sama dari jenis deduksi sebagai template, satu-satunya pengecualian yang saya sadari adalah bahwa daftar brace-init, yang disimpulkan oleh autoas 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 xsebagai int, dan tidak const int& .
Bentuk lainnya,
auto& x = expression
tidak menghapus kualifikasi cv, jadi, dengan menggunakan contoh di atas, auto& x = f()menyimpulkan xsebagai 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 decltypeaturan pengurangan tipe.
Jadi singkatnya kalau mau copy pakai auto. Kalau mau referensinya pakai auto&. Gunakan constkapan 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 expressionadalah nilai l, maka xadalah referensi nilai l dengan kualifikasi cv dari expression. Jika expressionrvalue, maka xrvalue referensi.
autokerjanya (kecuali untuk kasus khususinitializer_lists, yaitu non-deduced dalam konteks template), laluautoketik deduction.