Dalam C ++ dimungkinkan untuk menggunakan static
kata kunci dalam unit terjemahan untuk mempengaruhi visibilitas simbol (baik variabel atau deklarasi fungsi).
Di n3092, ini sudah tidak digunakan lagi:
Lampiran D.2 [depr.static]
Penggunaan kata kunci statis tidak digunakan lagi saat mendeklarasikan objek dalam lingkup namespace (lihat 3.3.6).
Di n3225, ini telah dihapus.
Satu- satunya artikel yang dapat saya temukan agak informal.
Itu memang menggarisbawahi, bahwa untuk kompatibilitas dengan C (dan kemampuan untuk mengkompilasi program-C sebagai C ++) penghentian itu mengganggu. Namun, mengompilasi program C secara langsung sebagai C ++ bisa menjadi pengalaman yang membuat frustrasi, jadi saya tidak yakin apakah itu perlu dipertimbangkan.
Adakah yang tahu mengapa itu diubah?
Jawaban:
Dalam Laporan Cacat Bahasa Inti Standar C ++ dan Masalah yang Diterima, Revisi 94 di bawah 1012. Statis yang tidak berlaku lagi , mereka mencatat:
Pada dasarnya mengatakan bahwa penghinaan
static
tidak masuk akal. Ini tidak akan pernah dihapus dari C ++, dan ini masih berguna karena Anda tidak memerlukan kode boilerplate yang Anda perlukan dengan namespace yang tidak bernama, jika Anda hanya ingin mendeklarasikan fungsi atau objek dengan tautan internal.sumber
static class ...
, OTOH, tidak akan berhasil.namespace {
" dan "}
"?Saya akan mencoba untuk menjawab pertanyaan Anda, meskipun itu adalah pertanyaan lama, dan tidak terlihat sangat penting (sebenarnya tidak sangat penting dalam dirinya sendiri ), dan telah menerima jawaban cukup baik sudah. Alasan saya ingin menjawabnya adalah karena ini berkaitan dengan masalah mendasar evolusi standar dan desain bahasa ketika bahasa didasarkan pada bahasa yang ada: kapan fitur bahasa harus dihentikan, dihapus, atau diubah dengan cara yang tidak kompatibel?
Keterkaitan itu sebenarnya.
Penghentian menunjukkan:
Poin terakhir ini penting. Meskipun tidak pernah ada janji resmi bahwa program Anda tidak akan rusak, terkadang diam-diam, oleh standar berikutnya, panitia harus berusaha menghindari pelanggaran kode yang "masuk akal". Penghentian harus memberi tahu programmer bahwa tidak masuk akal untuk bergantung pada beberapa fitur .
Sangat penting untuk mempertahankan subset umum C / C ++, terutama untuk file header. Tentu saja,
static
deklarasi global adalah deklarasi simbol dengan linkage internal dan ini tidak terlalu berguna dalam file header.Tapi masalahnya bukan hanya kompatibilitas dengan C, itu juga kompatibilitas dengan C ++ yang ada: ada banyak program C ++ valid yang menggunakan
static
deklarasi global. Kode ini tidak hanya legal secara formal, tetapi juga masuk akal, karena menggunakan fitur bahasa yang terdefinisi dengan baik seperti yang dimaksudkan untuk digunakan .Hanya karena sekarang ada "cara yang lebih baik" (menurut beberapa) untuk melakukan sesuatu tidak membuat program yang ditulis dengan cara lama "buruk" atau "tidak masuk akal". Kemampuan menggunakan
static
kata kunci pada deklarasi objek dan fungsi pada lingkup global dipahami dengan baik di komunitas C dan C ++, dan paling sering digunakan dengan benar.Dengan nada yang sama, saya tidak akan mengubah model C
double
menjadistatic_cast<double>
hanya karena "C-style cast buruk", karenastatic_cast<double>
menambahkan informasi nol dan keamanan nol.Gagasan bahwa setiap kali cara baru untuk melakukan sesuatu ditemukan, semua programmer akan buru-buru menulis ulang kode kerja mereka yang sudah terdefinisi dengan baik adalah gila. Jika Anda ingin menghapus semua keburukan dan masalah C yang diwariskan, Anda tidak mengubah C ++, Anda menciptakan bahasa pemrograman baru. Menghapus setengah satu penggunaan
static
hampir tidak membuat C ++ kurang C-jelek.Perubahan kode membutuhkan pembenaran, dan "lama itu buruk" tidak pernah menjadi pembenaran untuk perubahan kode.
Pemutusan perubahan bahasa membutuhkan pembenaran yang sangat kuat. Menyederhanakan bahasa ini tidak pernah menjadi pembenaran untuk perubahan besar.
Alasan yang diberikan mengapa
static
buruk hanya sangat lemah, dan bahkan tidak jelas mengapa deklarasi objek dan fungsi tidak digunakan bersama-sama - memberi mereka perlakuan yang berbeda hampir tidak membuat C ++ lebih sederhana atau lebih ortogonal.Jadi, sungguh, ini adalah kisah yang menyedihkan. Bukan karena konsekuensi praktis yang dimilikinya: ia sama sekali tidak memiliki konsekuensi praktis. Tapi karena itu menunjukkan kurangnya akal sehat dari panitia ISO.
sumber
static
atau ruang nama anonim, saya juga tidak menyemangati atau mengecilkan hati. Maksud saya adalah jika Anda benar-benar ingin mencegah orang menggunakan ruang nama anonim, Anda harus memberi mereka argumen yang baik. Dalam praktiknya, saya yakin bahwa di sebagian besar entitas implementasi yang dideklarasikan dalam namespace tanpa nama adalah simbol yang diekspor dengan nama acak, sehingga tabel ekspor akan bertambah. Entitas yang dideklarasikan sebagaistatic
, OTOH, tidak diekspor dengan cara apa pun. Dengan demikian banyak orang memilih, berdasarkan pengamatan itu, untuk digunakanstatic
.static
tidak akan pernah hilang, jadi salah untuk mencabutnya. " Namun Anda tidak membuat argumen bahwa melarang penggunaannya adalah salah. " Saya tidak melihat argumen yang meyakinkan yang menunjukkan bahwa penggunaan namespace-scopestatic
adalah "salah". Mencela itu hanya untuk mencegah penggunaannya adalah salah, karena tidak ada yang benar-benar percaya itu akan hilang, dan karena tidak meyakinkan orang bahwa menggunakannya adalah "salah".Tidak berlaku lagi atau tidak, menghapus fitur bahasa ini akan merusak kode yang ada dan mengganggu orang.
Keseluruhan depresiasi statis hanyalah angan-angan di sepanjang baris "ruang nama anonim lebih baik daripada statis" dan "referensi adalah petunjuk yang lebih baik". Lol.
sumber
char* foo = new char; char& ref = *foo;
Hanya karena Anda diberi penunjuk pada awalnya tidak mengatakan apa pun tentang kemampuan Anda untuk menggunakan referensi.