Motivasi dan jebakan (?) Dari kata kunci otomatis di C ++ 11

20

Saya baru-baru ini bertanya-tanya mengapa kata kunci autodipilih dalam C ++ 11 untuk menandai variabel yang jenisnya harus disimpulkan oleh kompiler, seperti di

auto x = 1;

Sejak

  1. var tampaknya lebih umum di bahasa pemrograman lain (misalnya C #, Scala, JavaScript), dan
  2. Sejauh yang saya mengerti semantik baru dari autokompatibilitas 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 varatau 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?

Giorgio
sumber
9
Semantik baru dari automungkin merusak kompatibilitas ke belakang, tetapi, tergantung pada seberapa sering vardigunakan sebagai nama variabel dibandingkan dengan seberapa sering autokata kunci digunakan dalam kode pra-11, panitia mungkin berpendapat bahwa itu merusak kompatibilitas kurang dramatis daripada memperkenalkan yang baru kata kunci akan.
sepp2k
2
"Seperti yang ada sekarang, pertanyaan ini tidak cocok untuk format Tanya Jawab kami. Kami berharap jawaban didukung oleh fakta, referensi, atau keahlian khusus, tetapi pertanyaan ini kemungkinan akan mengumpulkan debat, argumen, polling, atau diskusi panjang. Jika Anda merasa bahwa pertanyaan ini dapat diperbaiki dan mungkin dibuka kembali, lihat FAQ untuk panduan. ": Pertanyaan ini menanyakan fakta: apakah ada diskusi tentang topik ini. Ada dua kemungkinan jawaban: YA dan TIDAK.
Giorgio
2
Tentu saja ada diskusi, yang membuat pertanyaan itu agak tidak berguna dalam hal itu. Pertanyaan autovs varadalah apa yang dirujuk 90% dari teks Anda, dan pertanyaan itu tidak memiliki hasil yang pasti. (meskipun saya bukan orang yang memilih untuk menutup)
Telastyn
1
@ Telastyn: Jika saya tahu bahwa ada diskusi tentang topik ini saya tidak akan bertanya. Googling untuk "auto versus var C ++" atau "auto C ++" tidak menghasilkan apa-apa tentang topik ini.
Giorgio
1
autodiusulkan untuk C ++ sebelum vardiperkenalkan di C # jadi pertanyaannya adalah mengapa C # tidak menggunakan otomatis. var memiliki arti berbeda dalam JavaScript dan Scala
adrianm

Jawaban:

37

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:

auto int i=0;

kapan

int i=0;

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 varAnda 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

auto int i=0;

dan mencoba mengkompilasi dengan kompiler C ++ 11, Anda sekarang akan mendapatkan kesalahan seperti

kesalahan C3530: 'otomatis' tidak dapat digabungkan dengan jenis-penentu lainnya

Ini sepele, Anda cukup menghapus auto atau int dan mengkompilasi ulang.

Namun ada masalah yang lebih besar. Jika kamu punya

auto i = 4.3;

C dan C ++ benar-benar tua akan membuat isebuah int(karena akan jika Anda tinggalkan auto- deklarasi standar itu int). 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 membuatnya doublekarena itulah yang 4.3. (Atau mungkin a float, saya masih dalam mode Boxing Day, tapi intinya, bukan int.) 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 untuk automemastikan mereka tidak menggunakannya dengan cara lama sebelum mereka pindah ke kompiler C ++ 11. Untungnya, kode seperti itu sangat jarang.

Kate Gregory
sumber
Terima kasih atas jawaban yang sangat jelas. +1 Saya memahami pertukaran antara menjatuhkan kompatibilitas ke belakang dalam cara yang sebagian besar tidak berbahaya dan memiliki peluang besar bahwa kode lama tidak rusak oleh kata kunci baru.
Giorgio
Apakah sebenarnya ada ketidakcocokan sama sekali? Bukankah kompiler C ++ 11 mengabaikan saja autojika diikuti oleh nama tipe?
aaaaaaaaaaaa
1
Visual C ++ 2012 mengatakan error C3530: 'auto' cannot be combined with any other type-specifierke baris itu
Kate Gregory
3
@KateGregory: Sebenarnya, tidak ada masalah dengan auto 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).
Bart van Ingen Schenau
1
@ Kate Gregory: Jika Anda dapat mempertimbangkan pengamatan Bart dan mengubah jawaban Anda, saya akan menandainya sebagai jawaban yang diterima.
Giorgio