Cplusplus.com ile ilgili sorun nedir?


201

Bu belki de bu soru için son derece uygun bir forum değil, ama taşınmam riski altında bir şans vereyim.

C ++ standart kitaplığı için paha biçilmez ISO standardı, MSDN , IBM , cppreference ve cplusplus gibi çeşitli referanslar vardır . Şahsen, C ++ yazarken hızlı rasgele erişim, kısa yükleme süreleri ve kullanım örnekleri olan bir referansa ihtiyacım var ve cplusplus.com'u oldukça kullanışlı buluyorum. Ancak, bu web sitesi hakkında SO hakkında sık sık olumsuz görüşler duydum, bu yüzden belirli olsun istiyorum:

Cplusplus.com tarafından verilen hatalar, yanlış anlaşılmalar veya kötü tavsiye parçaları nelerdir? Kodlama kararları vermek için kullanmanın riskleri nelerdir?

Bu noktayı ekleyeyim: Burada standartla ilgili doğru alıntılarla SO ile ilgili soruları cevaplamak istiyorum ve bu nedenle hemen kullanılabilir bağlantılar göndermek istiyorum ve cplusplus.com, seçim sitem olmasaydı seçim sitem olurdu bu konu.


62
Neden inişler? Bu tamamen geçerli bir soru. Bir referansa ihtiyacınız varsa, güvenilir bir kaynak istiyorsunuz. Ayrıca standart kütüphane için hızlı bir referans alabileceğim cplusplus.com'a karşı şikayetler duydum ve bu ilginç.
Xeo

48
@Olafur: Fikir istemiyorum, o sitede yanlış hata listeleri istiyorum. Eğer yoksa, bu soruyu gelecekteki eleştirileri ortadan kaldırmak için kullanmak istiyorum.
Kerrek SB

4
@ Ólafur Ücret: belki. Ancak bu web sitesinin içeriğinin doğruluğu / doğruluğu hakkında mükemmel objektif noktalar yapılabilir.
Daniel Sloof

14
Google'da zaten "cplusplus.com" için birinci sayfada bulunuyoruz. SO sorularının arama sıralamalarına ne kadar hızlı çıktığı etkileyici.
Yörüngedeki Hafiflik Yarışları

5
Bu sorunun "cplusplus" aramalarında ne kadar yüksek olduğu göz önüne alındığında - bu soru sorulduğundan beri cplusplus.com'da bir dizi düzeltme yapıldığını belirtmek adil olur. Aslında, hataları gösteren ilk üç cevap artık doğru değildir.
Mark H

Yanıtlar:


72

Düzenleme:std::remove Bu yanıt yazıldığı için dokümanları düzeltildi. Aynı şey için de geçerlidir list::remove.

Size cpluscplus.com'un nasıl yanlış yapabileceğini gösteren bir örnek vereyim.

std::removeİşlevini düşünün <algorithm>.

Gerçek şu ki std::remove, öğeyi konteynırdan çıkarmıyor. Çünkü std::removesadece bir çift yineleyici ile çalışır ve aslında öğeleri içeren konteyner hakkında hiçbir şey bilmez. Aslında, std::removetemeldeki kapsayıcıyı bilmek mümkün değildir , çünkü yineleyicilerin ait olduğu kapsayıcıyı keşfetmenin bir çift yineleyiciden geçmesinin bir yolu yoktur. Yani std::remove, öğeleri gerçekten kaldırmaz, çünkü yapamaz . Bir öğeyi kaptan gerçekten kaldırmanın tek yolu , o kapta bir üye işlevi çağırmaktır.

Bu nedenle, öğeleri kaldırmak istiyorsanız, Silme-Kaldırma Deyimini kullanın :

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

Ancak hakkında yanlış bilgi cplusplus.comverir . Diyor kistd::remove

Bu işlevin , eski değerlerini koruyan ve hala erişilebilir olan yeni sondan sonraki öğeleri değiştirmediğine dikkat edin .

ki bu doğru değil. Aralıktaki yineleyici [new_end, old_end)hala silinemez, ancak bu eski değerleri korudukları ve hala erişilebilir oldukları anlamına GELMEZ. Onlar belirtilmemiş.


Benzer şekilde, hakkında cplusplus.comda yanlış bilgi verir list::remove. Diyor ki ,

Kaldır, genel bir algoritma işlevinin benzer bir davranışla var olduğunu ancak iki yineleyici arasında çalıştığına dikkat edin.

ki bu tamamen yanlış. Küresel kaldır yani std::removebenzemiyor list::removebiz eski olduğunu gördüğümüz gibi, gerçekten kaldırmak DEĞİLDİR kaptan öğeleri çünkü olamaz ikincisi (üye fonksiyonu) oysa gerçekten kaldırmak yapar öğeleri önemlidir çünkü .

Bu cevap, küçük bir değişiklikle aşağıdaki konudaki başka bir cevabımdan kopyalandı:

Not: Yukarıdaki konuya yanıt verirken son zamanlarda karşılaştığım için hatırlıyorum. Son iki yılda hatırladığım birçok hata var. Tekrar karşılaşırsam birkaç tane daha ekleyebilirim.


1
+1: Bu sitede bu yanlış ifadelerden çok daha fazlası var mı?
Klaim

4
@Alexander: list::removeelemanları kaptan çıkarır. Ancak std::removeelemanları konteynırdan ÇIKARMAYIN. Ben edemez davranışları "benzer" olduğunu söylüyor.
Nawaz

3
İyi yakaladın! Bu aradığım şeylere çok iyi bir örnek.
Kerrek SB

3
"Benzer" tartışmalıdır, çünkü iki farklı işlemin benzer olup olmadığı bir görüş meselesidir. Ayrıca cplusplus.com'un belge olarak gizlenmiş bir görüş sunup sunmayacağı tartışmalıdır. Her neyse, "eski değerlerini koru" affedilemez bir hatadır, sadece cplusplus açıklamasının standarda dayanmadığını gösterir.
Steve Jessop

5
@Steve: Dedin "Similar" is debateable. Kelime similartartışmalı ise, o zaman bu kelimenin doğru kelime olmadığını ve davranışını açıklarken kaçınılması gerektiğini söyler std::removeve list::removebir açıklama mümkün olduğunca açık olması gerektiğinden, başka bir açıklama gerektirmemelidir.
Nawaz

38

Aksine biraz fikir sunacağım. Cplusplus.com'da birçok iyi bilgi var. Ölümüne seçin ve evet, elbette sorunları var, ama hangi site yok? Kesinlikle bu site değil . Cam evlerde yaşayan insanlar taş atmamalıdır. Burada da çok fazla yanlış bilgi var. Kabul edilen yanlış cevaplar, yerinde doğru cevaplar (bazıları olumsuz!)

Cplusplus.com ile ilgili bir sorun, kapalı bir site olmasıdır; aynısı belirtilen diğer referans siteleri için de geçerlidir. Bu, Stack Overflow gibi topluluk tarafından geliştirilmiş bir sitenin tahılına aykırıdır. Güvenilir düzenlemeler yapma yeteneğini edinmek bu kadar uzun sürmez ve en yeni yeniler bile iyileştirme için kolayca önerilerde bulunabilir. Bunu cplusplus.com ile karşılaştırın. Onların personeli değilseniz sürekli bir acemi vardır. WG21'in önemli bir üyesi olsanız bile, o sitenin herhangi bir yerinde bir hata görürseniz e-posta rapor mekanizmasından geçmeniz gerekir. Anathema!

Bu sitede kendi C ++ referansımızı geliştirmek bizim için bir çözüm olacaktır. Bu biraz iş gerektirecekti. Çok bilgiçlikten / çok teknik olmamaya dikkat etmeliyiz; cplusplus.com'un, akranları uzak tutan en az birkaç teknik editör kullandığı açıktır. Bilgiyi iyi organize etmeliyiz; buradaki SSS iyi organize edilmemiştir. Ayrıca, doğrudan standarttan çok fazla püskürtmemek için çok dikkatli olmalıyız; bu yasadışı.


7
Eskiden eski cppreference.com'u sık sık kullandım, ama şimdi wiki-ish (herkes tarafından düzenlemeye açık mı?) Bir şeye dönüştürdüler ... ve artık bundan hoşlanmıyorum. Önemli bilgileri görmek zor. Sadece cplusplus.com'dan aldığım doyumdan yoksundur. Bence.
Kerrek SB

14
Oha! Tam tersini görüyorum. Eski cppreference.com sık sık durdu çünkü çapraz ve kötü yazılmış zor buldum. Yeni cppreference.com, son paragrafımda tam olarak önerdiğim şeyi yapan reklamsız, topluluk tabanlı bir site gibi görünüyor.
David Hammen

1
Belki de sadece bendim, bir daha denemeliyim. Sanırım biraz bakmak istedim düşünüyorum <thread>ya <atomic>vazgeçtim böylece malzeme ve adil got "yazınız bu sayfayı". Tekrar kontrol edeyim! Oh, C ++ 0x desteği elbette büyük bir bonus olurdu!
Kerrek SB

10
"Cam evlerde yaşayan insanlar taş atmamalıdır." SO, cplusplus.com/reference gibi C ++ için bir kütüphane referansı olduğunu (kısmen) iddia etmez. İnsanlar burada iddiada bulunduklarında, onları destekleme standardını belirtiyorlar veya yoksa, başka biri gelir ve doldurur. Yanlışlarsa, çalışmalarını görebilirsiniz. Cplusplus.com yanlışsa, sadece yazarın "öğelerinin ayrıntılı açıklaması" üretmek için kullandığı dışında bazı C ++ uygulamalarında başarısız olacak kodu yazdınız. Sorun şu ki, cplusplus.com gayri resmi, ancak resmi görünmek için yazılmış.
Steve Jessop

4
SO gayri resmi ve gayri resmi görünmek için yazılmıştır. Şimdi, cplusplus.com doğru dokümantasyon / referans malzemesi olarak tasarlanmamışsa ve o zaman yeterince adil bir yerde bir feragatnameyi kaçırmışsam, sitenin kendisinden ziyade bu şekilde kullanan kişilere atılacak herhangi bir taş olduğunu varsayalım. Ancak önemli olan nokta, cplusplus.com'un bir C ++ işlevi hakkında bir şey söylemesinin doğru olduğu anlamına gelmediği ve bunu hızlı başvuru olarak kullanmayı planlıyorsanız bilmeye değer olmasıdır. Ben fonksiyon imzaları aramak için kullanın, ama asla benim kod uygun olsun ya da olmasın ince bir nokta yerleşmek için.
Steve Jessop

14

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

"Kopyalama çakışan nesneler arasında gerçekleşiyorsa, davranış tanımsızdır." (4.11.2.4 C89 standardında. C90'ın eline bir kopyam yok, bu C ++ 03'ün gerçekte ifade ettiği şey, ancak sadece sayfa numaralandırma gibi şeylerde farklılık göstermesi gerekiyor.)


Ah, eski C kütüphanesi ... güzel.
Kerrek SB

6
Bahsettiler destination and source shall not overlap.
Sniper

2
@Sniper "örtüşmeyecek" ile "davranış tanımsız" aynı değildir . Yorumunuz aslında cplusplus.com'un ince, yaygın başarısızlıklarından birini aydınlatıyor - doğru görünüyor, ancak doğru değil.
Andrew Henle

@Sniper: Sanırım 2011'de bu cevabı verdiğimde, girdiler üzerinde yeterli bir kısıtlama olarak "örtüşmemeliydim" demedi.
Steve Jessop

9

Cplusplus.com tarafından verilen belgeler genellikle yanlış veya eksiktir.

Böyle bir örnek, atoicplusplus.com'daki belgelerdir.

atoi
Dönüş bölümünde, işlev kullanılırken dönüşüm gerçekleştirilemezse 0 dönüş değerinden bahsedilmez.

cplusplus.com Dönüş bölümü "... Dönüştürülen değer bir int tarafından temsil edilebilir değerler aralığının dışındaysa tanımsız davranışa neden olur."

Bu, " Dizenin sayısal değeri int içinde temsil edilemiyorsa, davranış tanımsızsa " standardına göre doğrudur .

Ancak, bölüm yanıltıcı olabilecek dönüş değeri olarak 0'dan bahsetmediğinden dolu değildir. "... dönüşüm gerçekleştirilmez ve sıfır döndürülür" ifadesi. , daha önce açıklama paragrafında karşılanır, ancak İade bölümünde olması gerekir .

Cplusplus.com'da verilen örnek kaynak kodlarının çoğu yanlış.
Bu referanslara bakan yeni başlayanların çoğu ballant hatalarına neden olur.

Bir örnek vermek için:

EDIT: Daha önce belirttiğim örnek yanlıştı.


5
Belki ballant -> açık? Bununla birlikte, ballant, işaretçileri içeren hatalar için uygun olabilecek bir Fransızca "sarkma" kelimesidir.
hardmath

Yineleyici örneğini yeniden okuyun ... tanımlanmamış davranış yok.
Dennis Zickefoose

1
"Cplusplus.com'da verilen örnek kaynak kodların çoğu yanlış." ve daha sonra "Daha önce bahsettiğim örnek yanlıştı" diyen örneği kaldırdı. - Öyleyse örneği neden kaldırdın? :)
user2962533

Bu siteye göre, tanımladığınız durumda tanımlanmamış bir dönüş türünde sonuçlar tanımlanmamış davranış değil. en.cppreference.com/w/cpp/string/byte/atoi ; ancak, Cplusplus.com belgelerini söylediklerinize uyacak şekilde güncelledi. Belli ki topluluk düzeltme taleplerine yanıt veriyorlar. Yine de, hangi web sitesinin en doğru olduğundan emin değilim çünkü söz konusu ikisi çok farklı şeyler ifade ediyor.
shawn1874

Bu cevabın yayınlanmasından bu yana 9 yıl geçti. Cplusplus.com'un hala önemli miktarda yanlış veya eksik bilgi içerdiğine hala inanılıyor mu?
Tyler Shellberg

3

İçin belgeler önce type_infoaçıklamaya çalışır typeid, ancak başarısız olur:

typeid doğrudan tiplere uygulanabilir, bu durumda bilgilerini döndürür; Veya nesnelere, bu durumda nesnenin türü hakkında bilgi döndürür.

Typeid, polimorfik sınıf türündeki bir nesneye (sanal bir işlevi bildiren veya devralınan bir sınıf) nesnesinin bir kaydı kaldırılmış işaretçiye uygulandığında, dinamik türünü (yani en türetilen nesnenin türü) dikkate alır.

Şimdi ikinci paragraf birinciyle aynı fikirde değil. In typeid(*ptr), typeidbir ifadeye uygulanır. Bu oldukça önemlidir, çünkü türleri staticve dynamictürleri kavramı, nesneler için değil, ifade bağlamında anlamlıdır. Ayrıca vakaları özlüyor typeid(foo()).

Ayrıca, ikinci paragraf referansları atlamaktadır. Onlar da başvurdukları nesnenin dinamik türünden farklı statik türlere sahip olabilirler.


Çok hoş - RTTI soruları tahmin edilebilir düzenlilikle SO geliyor. Neye referans vermeyeceğinizi bilmek güzel .
Kerrek SB

3

Dokümantasyonu std::pair<T1,T2>::operator==her iki unsurun eşitlik açısından test edildiğini söylüyor. Dokümantasyonu std::pair<T1,T2>::operator<, ikinci elemanların sadece ilk elemanlar eşit olduğunda dikkate alındığını söylüyor.

Her iki durumda da "eşit" kelimesi görünür. Ancak, sadece ilk durumda bu gerçekten demek T::operator==. İkinci durumda, eşit araçlar!(a.first<b.first || b.first<a.first)


Bu zorunlu mu veya operator==operatör varsa ikinci kütüphanede kullanmak ücretsiz mi?
Kerrek SB

1
Zorunlu. C ++ standardı operator==ve operator<.
MSalters
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.