Apa yang salah dengan cplusplus.com?

201

Ini mungkin bukan forum yang sangat cocok untuk pertanyaan ini, tetapi izinkan saya mencobanya, dengan risiko dipindahkan.

Ada beberapa referensi untuk pustaka standar C ++, termasuk standar ISO yang tak ternilai, MSDN , IBM , cppreference , dan cplusplus . Secara pribadi, ketika menulis C ++ saya memerlukan referensi yang memiliki akses acak cepat, waktu muat pendek dan contoh penggunaan, dan saya telah menemukan cplusplus.com cukup berguna. Namun, saya sering mendengar pendapat negatif tentang situs web itu di SO, jadi saya ingin spesifik:

Apa kesalahan, kesalahpahaman atau saran buruk yang diberikan oleh cplusplus.com? Apa risiko menggunakannya untuk membuat keputusan pengkodean?

Izinkan saya menambahkan poin ini: Saya ingin dapat menjawab pertanyaan di sini di SO dengan kutipan akurat dari standar, dan dengan demikian saya ingin memposting tautan yang dapat digunakan segera, dan cplusplus.com akan menjadi situs pilihan saya jika bukan karena masalah ini.

Kerrek SB
sumber
62
Mengapa downvotes? Ini adalah pertanyaan yang sangat valid. Jika Anda memerlukan referensi, Anda ingin sumber tepercaya. Saya juga mendengar keluhan terhadap cplusplus.com, di mana saya bisa mendapatkan referensi cepat untuk perpustakaan standar dan karenanya, ini menarik.
Xeo
48
@ Elafur: Saya tidak ingin pendapat, saya ingin daftar kesalahan nyata di situs itu. Jika tidak ada, saya ingin dapat menggunakan pertanyaan ini untuk menghilangkan kritik di masa depan.
Kerrek SB
4
@ Ólafur Waage: mungkin. Tetapi poin objektif yang sempurna dapat dibuat tentang keakuratan / kebenaran isi situs web itu.
Daniel Sloof
14
Kami sudah ada di halaman satu untuk "cplusplus.com" di Google. Sangat mengesankan betapa cepatnya pertanyaan SO menaiki peringkat pencarian.
Lightness Races in Orbit
5
Saya pikir itu wajar - mengingat betapa tingginya peringkat pertanyaan ini pada pencarian "cplusplus" - untuk mencatat bahwa, sejak pertanyaan ini diajukan, sejumlah koreksi telah dilakukan ke cplusplus.com. Faktanya, tiga jawaban teratas yang menunjukkan kesalahan tidak lagi benar.
Mark H

Jawaban:

72

Sunting: Dokumentasi untuk std::removetelah diperbaiki sejak jawaban ini ditulis. Hal yang sama berlaku untuk list::remove.

Biarkan saya memberi Anda sebuah contoh untuk menunjukkan kepada Anda bagaimana cpluscplus.com bisa salah.

Pertimbangkan std::removefungsi dari <algorithm>.

Faktanya adalah itu std::removetidak menghapus item dari wadah. Ini karena hanya std::removebekerja dengan sepasang iterator dan tidak tahu apa-apa tentang wadah yang sebenarnya berisi item. Bahkan, tidak mungkin untuk std::removemengetahui wadah yang mendasarinya, karena tidak ada cara yang bisa dilakukan oleh sepasang iterator untuk menemukan tentang wadah yang menjadi milik iterator. Jadi std::removetidak benar-benar menghapus item, hanya karena tidak bisa . Satu-satunya cara untuk benar - benar menghapus item dari wadah adalah dengan menjalankan fungsi anggota pada wadah itu.

Jadi jika Anda ingin menghapus item, gunakan Erase-Remove Idiom :

 v.erase(std::remove(v.begin(), v.end(), 10), v.end()); 

Tetapi cplusplus.commemberikan informasi yang salah tentang std::remove. Ia mengatakan

Perhatikan bahwa fungsi ini tidak mengubah elemen melewati akhir yang baru, yang menjaga nilai-nilai lama dan masih dapat diakses .

itu tidak benar. Iterator dalam rentang [new_end, old_end)masih dereferenceable, tetapi itu TIDAK berarti bahwa mereka menjaga nilai-nilai lama dan masih dapat diakses. Mereka tidak ditentukan.


Demikian pula, cplusplus.commemberikan informasi yang salahlist::remove juga. Dikatakan ,

Perhatikan bahwa fungsi algoritme global, hapus, ada dengan perilaku serupa tetapi beroperasi di antara dua iterator.

yang benar-benar salah. Penghapusan global yaitu std::removetidak sama dengan list::remove, seperti yang kita lihat bahwa yang pertama TIDAK benar-benar menghapus barang dari wadah karena tidak bisa , sedangkan yang terakhir (fungsi anggota) benar-benar menghapus barang karena bisa .

Jawaban ini disalin dari jawaban saya yang lain dalam topik berikut, dengan sedikit modifikasi:

Catatan: Karena saya menemukan ini baru-baru ini ketika saya menjawab dalam topik di atas, saya mengingatnya. Ada banyak kesalahan yang saya temui selama dua tahun terakhir, yang saya tidak ingat. Saya mungkin menambahkan beberapa lagi nanti, jika saya menemukan lagi.

Nawaz
sumber
1
+1: apakah ada lebih banyak pernyataan yang salah di situs ini?
Klaim
4
@Alexander: list::removetidak menghapus elemen dari wadah. Tetapi std::removeTIDAK menghapus elemen dari wadah. Saya tidak bisa mengatakan perilaku mereka "mirip".
Nawaz
3
Tangkapan bagus! Itu contoh yang sangat bagus dari hal-hal yang saya cari.
Kerrek SB
3
"Serupa" dapat diperdebatkan, karena ini masalah pendapat apakah dua operasi yang berbeda sama atau tidak. Juga bisa diperdebatkan apakah cplusplus.com harus menawarkan opini yang disamarkan sebagai dokumentasi. Tapi bagaimanapun, "menjaga nilai lama mereka" adalah kesalahan yang tidak dapat dimaafkan, itu hanya menunjukkan bahwa deskripsi cplusplus tidak didasarkan pada standar.
Steve Jessop
5
@Steve: Anda bilang "Similar" is debateable. Jika kata similartersebut dapat diperdebatkan, maka kata itu sangat mengatakan bahwa kata ini bukan kata yang tepat dan harus dihindari ketika menjelaskan perilaku std::removedan list::remove, karena penjelasan harus jelas sebanyak mungkin, tidak perlu penjelasan lain.
Nawaz
38

Saya akan menawarkan sedikit opini yang bertentangan. Ada banyak informasi bagus di cplusplus.com. Pilih mati-matian, dan ya, tentu saja ada masalah, tetapi situs apa yang tidak? Tentu bukan situs ini . Orang yang tinggal di rumah kaca seharusnya tidak melempar batu. Ada banyak informasi yang salah di sini juga. Ada jawaban yang diterima yang benar-benar salah, jawaban downvoted (beberapa negatif!) Yang tepat.

Satu masalah dengan cplusplus.com adalah bahwa itu adalah situs tertutup; hal yang sama berlaku untuk sebagian besar situs referensi lain yang disebutkan. Ini bertentangan dengan butir situs yang dikembangkan komunitas seperti Stack Overflow. Memperoleh kemampuan untuk melakukan pengeditan tepercaya tidak membutuhkan waktu lama, dan bahkan pemula baru dapat dengan mudah membuat saran untuk perbaikan. Bandingkan dengan cplusplus.com. Anda adalah newbie abadi jika Anda tidak di staf mereka. Bahkan jika Anda adalah anggota kunci WG21, Anda harus melalui mekanisme laporan email mereka jika Anda melihat bug di suatu tempat di situs itu. Laknat!

Sebuah solusi bagi kami di situs ini adalah mengembangkan referensi C ++ kami sendiri. Ini akan membutuhkan sedikit usaha. Kita harus berhati-hati agar tidak terlalu bertele-tele / terlalu teknis; jelas bahwa cplusplus.com mempekerjakan setidaknya beberapa editor teknis yang menjaga kericuhan. Kami harus menyimpan informasi dengan baik; FAQ di sini tidak terorganisir dengan baik. Kami juga harus sangat berhati-hati untuk tidak menyemburkan terlalu banyak langsung dari standar; itu ilegal.

David Hammen
sumber
7
Saya sering mengunjungi cppreference.com yang lama, tetapi sekarang mereka telah mengolahnya menjadi sesuatu yang wiki-ish (apakah ini terbuka untuk diedit oleh semua orang?) ... dan saya tidak lagi menyukainya. Sulit untuk melihat informasi penting, saya temukan. Itu hanya kekurangan kepuasan langsung yang saya dapatkan dari cplusplus.com. Kupikir.
Kerrek SB
14
Wah! Saya melihat sebaliknya. Saya berhenti mengunjungi cppreference.com lama karena saya merasa sulit untuk dilintasi dan ditulis dengan buruk. Cppreference.com baru tampaknya merupakan situs berbasis komunitas yang bebas iklan yang melakukan persis seperti yang saya sarankan di paragraf terakhir saya.
David Hammen
1
Mungkin itu hanya aku, aku akan mencobanya lagi. Saya pikir saya ingin mencari beberapa <thread>atau lebih <atomic>dan hanya mendapat "tolong tulis halaman ini" jadi saya menyerah. Biarkan saya periksa lagi! Oh, dukungan C ++ 0x tentu saja akan menjadi bonus besar!
Kerrek SB
10
"Orang-orang yang tinggal di rumah kaca seharusnya tidak melempar batu." SO tidak mengklaim sebagai (sebagian) referensi pustaka untuk C ++ seperti yang dilakukan cplusplus.com/reference . Ketika orang membuat klaim di sini, mereka mengutip standar untuk mendukungnya, atau jika tidak maka seseorang datang dan mengisi. Jika mereka salah, Anda dapat melihat pekerjaan mereka. Jika cplusplus.com salah, Anda hanya menulis kode yang akan gagal pada beberapa implementasi C ++ selain yang digunakan penulis untuk menghasilkan "deskripsi terperinci tentang elemen-elemennya". Masalahnya adalah bahwa cplusplus.com bersifat informal, tetapi ditulis agar terlihat formal.
Steve Jessop
4
SO bersifat informal, dan ditulis untuk terlihat informal. Sekarang, jika cplusplus.com tidak dimaksudkan untuk menjadi bahan dokumentasi / referensi yang akurat dan saya telah melewatkan penafian di suatu tempat maka cukup adil, anggap batu apa pun akan dilempar ke orang yang menggunakannya dengan cara itu daripada situs itu sendiri. Tetapi intinya adalah hanya karena cplusplus.com mengatakan sesuatu tentang fungsi C ++ tidak berarti itu benar, dan perlu diketahui bahwa jika Anda berencana untuk menggunakannya sebagai referensi cepat. Saya menggunakannya untuk mencari tanda tangan fungsi, tetapi tidak pernah menyelesaikan poin baik apakah kode saya sesuai atau tidak.
Steve Jessop
14

http://www.cplusplus.com/reference/clibrary/cstring/strncpy/

Gagal menyebutkan bahwa "Jika penyalinan terjadi di antara objek yang tumpang tindih, perilaku tidak terdefinisi." (4.11.2.4 dalam standar C89. Saya tidak memiliki salinan C90, yang mengacu pada C ++ 03, tetapi mereka seharusnya hanya berbeda dalam hal-hal seperti penomoran halaman.)

Steve Jessop
sumber
Ah, perpustakaan C lama ... bagus.
Kerrek SB
6
Mereka menyebutkan destination and source shall not overlap.
Sniper
2
@Sniper "tidak akan tumpang tindih" tidak sama dengan "perilaku tidak terdefinisi". Komentar Anda benar-benar menyinari salah satu kegagalan cplusplus.com yang halus dan meresap - kedengarannya benar, tetapi itu tidak benar.
Andrew Henle
@ Sniper: Saya pikir mungkin itu tidak mengatakan bahwa ketika saya membuat jawaban ini pada tahun 2011. Saya akan mengambil "tidak akan tumpang tindih" sebagai kendala yang cukup pada input.
Steve Jessop
9

Dokumentasi yang diberikan oleh cplusplus.com seringkali salah atau tidak lengkap.

Setelah contoh tersebut, atoidokumentasi di cplusplus.com.

atoi
Di bagian Kembali, tidak disebutkan tentang nilai balik 0 jika tidak ada konversi yang dapat dilakukan saat menggunakan fungsi.

cplusplus.com Kembali bagian negara "... Jika nilai yang dikonversi akan keluar dari rentang nilai representable oleh int, hal itu menyebabkan perilaku undefined."

Ini benar, sesuai standar " Jika nilai numerik string tidak dapat direpresentasikan dalam int, maka perilaku tidak terdefinisi ".

Namun bagian ini tidak penuh karena tidak menyebutkan 0 sebagai nilai pengembalian, yang dapat menyesatkan. Ungkapan "... tidak ada konversi dilakukan dan nol dikembalikan." terpenuhi sebelumnya dalam paragraf deskripsi, tetapi penting untuk memilikinya di bagian Return .

Banyak kode sumber sampel yang diberikan di cplusplus.com salah.
Banyak pemula yang mencari referensi ini menyebabkan kesalahan besar.

Untuk mengutip contoh:

EDIT: Contoh yang saya kutip sebelumnya salah.

Alok Simpan
sumber
5
Mungkin ballant -> blatant? Namun ballant adalah kata dalam bahasa Prancis untuk "menggantung", yang mungkin cocok untuk kesalahan yang melibatkan pointer.
hardmath
Baca kembali contoh iterator ... tidak ada perilaku yang tidak terdefinisi.
Dennis Zickefoose
1
Anda menyatakan "Banyak kode sumber sampel yang diberikan di cplusplus.com salah." dan kemudian menghapus contoh yang mengatakan "Contoh yang saya kutip sebelumnya salah." - Mengapa Anda menghapus contohnya? :)
user2962533
Menurut situs ini, kasus yang Anda gambarkan menghasilkan tipe pengembalian yang tidak ditentukan bukan perilaku yang tidak ditentukan. en.cppreference.com/w/cpp/string/byte/atoi ; namun, sepertinya Cplusplus.com memperbarui dokumentasinya untuk menyesuaikan dengan apa yang Anda katakan. Jelas mereka merespons permintaan masyarakat untuk koreksi. Namun demikian, saya tidak yakin situs web mana yang paling tepat karena keduanya mempertanyakan hal-hal yang sangat berbeda.
shawn1874
Sudah 9 tahun sejak jawaban ini diposting. Apakah masih diyakini secara umum bahwa Cplusplus.com mengandung sejumlah besar informasi yang salah atau tidak lengkap?
Tyler Shellberg
3

Dokumentasi untuk type_infomencoba menjelaskan typeidterlebih dahulu, tetapi gagal:

typeid dapat diterapkan langsung ke tipe, dalam hal ini mengembalikan informasinya; Atau ke objek, dalam hal ini mengembalikan informasi tentang jenis objek.

Ketika typeid diterapkan ke pointer dereferenced ke objek dari tipe kelas polimorfik (kelas yang mendeklarasikan atau mewarisi fungsi virtual), itu menganggap jenis dinamisnya (yaitu, jenis objek yang paling diturunkan).

Sekarang paragraf kedua sudah tidak setuju dengan paragraf pertama. In typeid(*ptr), typeidditerapkan ke ekspresi. Ini agak penting, karena gagasan staticdan dynamictipe hanya masuk akal dalam konteks ekspresi, bukan objek. Itu juga merindukan kasus seperti typeid(foo()).

Selanjutnya, paragraf kedua menghilangkan referensi. Mereka juga dapat memiliki tipe statis yang berbeda dari tipe dinamis dari objek yang mereka referensi.

MSalters
sumber
Sangat bagus - pertanyaan RTTI muncul di SO dengan keteraturan yang dapat diprediksi. Baik untuk mengetahui apa yang tidak untuk referensi.
Kerrek SB
3

Dokumentasi std::pair<T1,T2>::operator==mengatakan bahwa kedua elemen diuji untuk kesetaraan. Dokumentasi std::pair<T1,T2>::operator<mengatakan bahwa elemen kedua dianggap hanya jika elemen pertama sama.

Kata "sama" muncul dalam kedua kasus. Namun, hanya dalam kasus pertama yang benar-benar berarti T::operator==. Dalam kasus kedua, sama artinya!(a.first<b.first || b.first<a.first)

MSalters
sumber
Apakah ini wajib, atau perpustakaan bebas digunakan operator==dalam kasus kedua jika operator tersedia?
Kerrek SB
1
Wajib. Standar C ++ tidak mencampur operator==dan operator<.
MSalters