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.
Jawaban:
Sunting: Dokumentasi untuk
std::remove
telah diperbaiki sejak jawaban ini ditulis. Hal yang sama berlaku untuklist::remove
.Biarkan saya memberi Anda sebuah contoh untuk menunjukkan kepada Anda bagaimana cpluscplus.com bisa salah.
Pertimbangkan
std::remove
fungsi dari<algorithm>
.Faktanya adalah itu
std::remove
tidak menghapus item dari wadah. Ini karena hanyastd::remove
bekerja dengan sepasang iterator dan tidak tahu apa-apa tentang wadah yang sebenarnya berisi item. Bahkan, tidak mungkin untukstd::remove
mengetahui wadah yang mendasarinya, karena tidak ada cara yang bisa dilakukan oleh sepasang iterator untuk menemukan tentang wadah yang menjadi milik iterator. Jadistd::remove
tidak 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 :
Tetapi
cplusplus.com
memberikan informasi yang salah tentangstd::remove
. Ia mengatakanitu 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.com
memberikan informasi yang salahlist::remove
juga. Dikatakan ,yang benar-benar salah. Penghapusan global yaitu
std::remove
tidak sama denganlist::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.
sumber
list::remove
tidak menghapus elemen dari wadah. Tetapistd::remove
TIDAK menghapus elemen dari wadah. Saya tidak bisa mengatakan perilaku mereka "mirip"."Similar" is debateable
. Jika katasimilar
tersebut dapat diperdebatkan, maka kata itu sangat mengatakan bahwa kata ini bukan kata yang tepat dan harus dihindari ketika menjelaskan perilakustd::remove
danlist::remove
, karena penjelasan harus jelas sebanyak mungkin, tidak perlu penjelasan lain.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.
sumber
<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!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.)
sumber
destination and source shall not overlap
.Dokumentasi yang diberikan oleh cplusplus.com seringkali salah atau tidak lengkap.
Setelah contoh tersebut,
atoi
dokumentasi 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.
sumber
Dokumentasi untuk
type_info
mencoba menjelaskantypeid
terlebih dahulu, tetapi gagal:Sekarang paragraf kedua sudah tidak setuju dengan paragraf pertama. In
typeid(*ptr)
,typeid
diterapkan ke ekspresi. Ini agak penting, karena gagasanstatic
dandynamic
tipe hanya masuk akal dalam konteks ekspresi, bukan objek. Itu juga merindukan kasus sepertitypeid(foo())
.Selanjutnya, paragraf kedua menghilangkan referensi. Mereka juga dapat memiliki tipe statis yang berbeda dari tipe dinamis dari objek yang mereka referensi.
sumber
Dokumentasi
std::pair<T1,T2>::operator==
mengatakan bahwa kedua elemen diuji untuk kesetaraan. Dokumentasistd::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)
sumber
operator==
dalam kasus kedua jika operator tersedia?operator==
danoperator<
.