Saya baru-baru ini bertanya-tanya mengapa kata kunci auto
dipilih dalam C ++ 11 untuk menandai variabel yang jenisnya harus disimpulkan oleh kompiler, seperti di
auto x = 1;
Sejak
var
tampaknya lebih umum di bahasa pemrograman lain (misalnya C #, Scala, JavaScript), dan- Sejauh yang saya mengerti semantik baru dari
auto
kompatibilitas mundur (jarang digunakan tetapi memiliki arti yang berbeda dalam revisi C ++ sebelumnya, lihat misalnya di sini )
Saya ingin bertanya apakah ada alasan khusus untuk memilih auto
(mendukung var
atau kata kunci lainnya). Apakah ada diskusi khusus tentang masalah ini sebelum standar C ++ 11 dirilis?
Juga, apakah ada kemungkinan ketidaksesuaian yang harus kita perhatikan ketika mengkompilasi ulang kode lama C ++ dengan kompiler C ++ 11?
c++
c++11
type-systems
Giorgio
sumber
sumber
auto
mungkin merusak kompatibilitas ke belakang, tetapi, tergantung pada seberapa seringvar
digunakan sebagai nama variabel dibandingkan dengan seberapa seringauto
kata kunci digunakan dalam kode pra-11, panitia mungkin berpendapat bahwa itu merusak kompatibilitas kurang dramatis daripada memperkenalkan yang baru kata kunci akan.auto
vsvar
adalah apa yang dirujuk 90% dari teks Anda, dan pertanyaan itu tidak memiliki hasil yang pasti. (meskipun saya bukan orang yang memilih untuk menutup)auto
diusulkan untuk C ++ sebelumvar
diperkenalkan di C # jadi pertanyaannya adalah mengapa C # tidak menggunakan otomatis. var memiliki arti berbeda dalam JavaScript dan ScalaJawaban:
Hampir setiap kata yang Anda anggap menambahkan sebagai kata kunci ke bahasa hampir pasti telah digunakan sebagai nama variabel atau bagian lain dari kode kerja. Kode ini akan rusak jika Anda menjadikan kata itu kata kunci.
Hal yang sangat beruntung tentang
auto
adalah sudah kata kunci, jadi orang tidak memiliki variabel dengan nama itu, tetapi tidak ada yang menggunakannya, karena itu adalah default. Mengapa mengetik:kapan
berarti hal yang persis sama?
Saya kira di suatu tempat di planet ini ada sejumlah kecil kode yang menggunakan 'otomatis' dengan cara lama. Tapi itu bisa diperbaiki dengan menghapus 'otomatis' dan itu akan berfungsi lagi. Jadi itu adalah pilihan yang cukup jelas untuk menggunakan kembali kata kunci.
Saya juga kebetulan berpikir itu adalah makna yang lebih jelas. Jika Anda telah bekerja dengan varian dan semacamnya, ketika Anda melihat
var
Anda mungkin berpikir bahwa deklarasi tersebut entah bagaimana diketik kurang kuat daripada jika Anda menekan semua tombol sendiri pada keyboard untuk menentukan jenis variabel. Untuk saya,auto
jelaskan bahwa Anda meminta kompiler untuk secara otomatis menyimpulkan tipe, yang sama kuatnya seperti jika Anda telah menentukannya sendiri. Jadi itu adalah keberuntungan yang sangat beruntung yang membuat nama baik tersedia untuk panitia.Untuk mengklarifikasi pelanggaran (kecil):
Jika kamu punya
dan mencoba mengkompilasi dengan kompiler C ++ 11, Anda sekarang akan mendapatkan kesalahan seperti
Ini sepele, Anda cukup menghapus auto atau int dan mengkompilasi ulang.
Namun ada masalah yang lebih besar. Jika kamu punya
C dan C ++ benar-benar tua akan membuat
i
sebuahint
(karena akan jika Anda tinggalkanauto
- deklarasi standar ituint
). Jika Anda telah berjalan sangat lama tanpa mengkompilasi kode ini, atau telah menggunakan kompiler lama, Anda dapat memiliki beberapa kode ini, setidaknya secara teori. C ++ 11 akan membuatnyadouble
karena itulah yang 4.3. (Atau mungkin afloat
, saya masih dalam mode Boxing Day, tapi intinya, bukanint
.) Ini mungkin memperkenalkan bug halus di seluruh aplikasi Anda. Dan tanpa peringatan atau kesalahan dari kompiler. Orang-orang di kapal ini harus mencari secara global untukauto
memastikan mereka tidak menggunakannya dengan cara lama sebelum mereka pindah ke kompiler C ++ 11. Untungnya, kode seperti itu sangat jarang.sumber
auto
jika diikuti oleh nama tipe?error C3530: 'auto' cannot be combined with any other type-specifier
ke baris ituauto i = 4.3;
, karena itu salah bentuk di C ++ 03 / C ++ 98. C ++ tidak meneruskan aturan 'implisit int' yang dimiliki C89 (dan dijatuhkan dalam revisi C99).