Was ist los mit cplusplus.com?

200

Dies ist vielleicht kein perfekt geeignetes Forum für diese Frage, aber lassen Sie mich es versuchen, auf die Gefahr hin, weggezogen zu werden.

Es gibt verschiedene Referenzen für die C ++ - Standardbibliothek, einschließlich des unschätzbaren ISO-Standards, MSDN , IBM , cppreference und cplusplus . Persönlich benötige ich beim Schreiben von C ++ eine Referenz mit schnellem Direktzugriff, kurzen Ladezeiten und Verwendungsbeispielen, und ich fand cplusplus.com ziemlich nützlich. Ich habe jedoch hier auf SO häufig negative Meinungen zu dieser Website gehört, daher möchte ich genau darauf eingehen:

Was sind die Fehler, Missverständnisse oder schlechten Ratschläge von cplusplus.com? Was sind die Risiken, wenn Sie damit Codierungsentscheidungen treffen?

Lassen Sie mich diesen Punkt hinzufügen: Ich möchte in der Lage sein, Fragen hier auf SO mit genauen Anführungszeichen des Standards zu beantworten, und daher möchte ich sofort verwendbare Links veröffentlichen, und cplusplus.com wäre meine bevorzugte Website gewesen, wenn es nicht gewesen wäre dieses Problem.

Kerrek SB
quelle
62
Warum die Abstimmungen? Dies ist eine absolut gültige Frage. Wenn Sie eine Referenz benötigen, möchten Sie eine vertrauenswürdige Quelle. Ich habe auch Beschwerden gegen cplusplus.com gehört, wo ich eine Kurzreferenz für die Standardbibliothek erhalten kann, und als solche ist dies interessant.
Xeo
48
@Olafur: Ich möchte keine Meinung, ich möchte konkrete Auflistungen von Fehlern auf dieser Seite. Wenn es keine gibt, möchte ich diese Frage nutzen können, um zukünftige Kritik zu zerstreuen.
Kerrek SB
4
@ Ólafur Waage: vielleicht. Es können jedoch vollkommen objektive Punkte über die Richtigkeit / Wahrhaftigkeit der Inhalte dieser Website gemacht werden.
Daniel Sloof
14
Wir sind bereits auf Seite eins für "cplusplus.com" bei Google. Es ist beeindruckend, wie schnell SO-Fragen in den Suchrankings aufsteigen.
Leichtigkeitsrennen im Orbit
5
Ich denke, es ist fair - angesichts des hohen Stellenwerts dieser Frage bei der Suche nach "cplusplus" - festzustellen, dass seit der Beantwortung dieser Frage eine Reihe von Korrekturen an cplusplus.com vorgenommen wurden. Tatsächlich sind die drei wichtigsten Antworten, die auf Fehler hinweisen, nicht mehr wahr.
Mark H

Antworten:

72

Bearbeiten: Die Dokumentation für std::removewurde behoben, seit diese Antwort geschrieben wurde. Gleiches gilt für list::remove.

Lassen Sie mich Ihnen ein Beispiel geben, um Ihnen zu zeigen, wie cpluscplus.com etwas falsch machen kann.

Betrachten Sie die std::removeFunktion von <algorithm>.

Tatsache ist, dass std::removeder Artikel nicht aus dem Container entfernt wird. Sein , weil std::removeArbeiten mit einem Paar von Iteratoren nur und nichts über die Container wissen , welche die Elemente tatsächlich enthalten. Tatsächlich ist es nicht möglich std::remove, den zugrunde liegenden Container zu kennen, da es unmöglich ist, von zwei Iteratoren aus herauszufinden, zu welchem ​​Container die Iteratoren gehören. So std::removeentfernen Sie nicht wirklich die Einzelteile, einfach weil es nicht kann . Die einzige Möglichkeit , ein Element tatsächlich aus einem Container zu entfernen, besteht darin, eine Elementfunktion für diesen Container aufzurufen.

Wenn Sie also die Elemente entfernen möchten, verwenden Sie Erase-Remove Idiom :

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

Aber cplusplus.comgibt falsche Informationen über std::remove. Es sagt

Beachten Sie, dass diese Funktion die Elemente nach dem neuen Ende nicht ändert , die ihre alten Werte beibehalten und weiterhin zugänglich sind .

das ist nicht richtig. Der Iterator im Bereich [new_end, old_end)ist immer noch dereferenzierbar, aber das bedeutet NICHT, dass sie die alten Werte beibehalten und weiterhin zugänglich sind. Sie sind nicht spezifiziert.


In ähnlicher Weise cplusplus.comgibt es auch falsche Informationen über list::remove. Es heißt :

Beachten Sie, dass eine globale Algorithmusfunktion, remove, mit einem ähnlichen Verhalten vorhanden ist, jedoch zwischen zwei Iteratoren arbeitet.

das ist völlig falsch. Das globale Entfernen ist nämlich std::removenicht ähnlich list::remove, da wir gesehen haben, dass das erstere die Elemente NICHT wirklich aus dem Container entfernt, weil es nicht kann , während das letztere (die Mitgliedsfunktion) die Elemente wirklich entfernt , weil es kann .

Diese Antwort wurde mit wenigen Änderungen aus meiner anderen Antwort im folgenden Thema kopiert:

Hinweis: Da ich kürzlich darauf gestoßen bin, als ich auf das obige Thema geantwortet habe, erinnere ich mich daran. Es gibt viele Fehler, auf die ich in den letzten zwei Jahren gestoßen bin, an die ich mich nicht erinnere. Ich könnte später noch ein paar hinzufügen, wenn ich wieder rüberkomme.

Nawaz
quelle
1
+1: Gibt es auf dieser Seite noch viel mehr dieser falschen Aussagen?
Klaim
4
@Alexander: Entfernt list::removedie Elemente aus dem Container. Entfernt std::removeaber NICHT die Elemente aus dem Container. Ich kann nicht sagen, dass ihr Verhalten "ähnlich" ist.
Nawaz
3
Schöner Fang! Das ist ein sehr gutes Beispiel für die Dinge, die ich suche.
Kerrek SB
3
"Ähnlich" ist umstritten, da es eine Ansichtssache ist, ob zwei verschiedene Operationen ähnlich sind oder nicht. Es ist auch umstritten, ob cplusplus.com eine als Dokumentation getarnte Stellungnahme abgeben sollte. Trotzdem ist "Behalte ihre alten Werte" ein unverzeihlicher Fehler. Es zeigt nur, dass die Beschreibung von cplusplus nicht auf dem Standard basiert.
Steve Jessop
5
@ Steve: Du hast gesagt "Similar" is debateable. Wenn das Wort similarumstritten ist, dann sagt es sehr viel, dass dieses Wort nicht das richtige Wort ist und sollte vermieden werden, wenn das Verhalten von std::removeund erklärt wird list::remove, da eine Erklärung so klar wie möglich sein sollte, sollte es keine weitere Erklärung erfordern.
Nawaz
38

Ich werde eine etwas gegenteilige Meinung abgeben. Auf cplusplus.com gibt es viele gute Informationen. Wählen Sie es zu Tode, und ja, natürlich hat es seine Probleme, aber welche Website nicht? Sicher nicht diese Seite . Menschen, die in Glashäusern leben, sollten keine Steine ​​werfen. Auch hier gibt es viele Fehlinformationen. Es gibt akzeptierte Antworten, die absolut falsch sind, herabgestimmte Antworten (einige negativ!), Die genau richtig sind.

Ein Problem bei cplusplus.com ist, dass es sich um eine geschlossene Site handelt. Gleiches gilt für die meisten anderen genannten Referenzseiten. Dies widerspricht einer von der Community entwickelten Site wie Stack Overflow. Der Erwerb der Fähigkeit, vertrauenswürdige Änderungen vorzunehmen, dauert nicht allzu lange, und selbst die neuesten Neulinge können leicht Verbesserungsvorschläge machen. Vergleichen Sie das mit cplusplus.com. Sie sind ein ewiger Neuling, wenn Sie nicht in ihrem Stab sind. Selbst wenn Sie ein Schlüsselmitglied von WG21 sind, müssen Sie den E-Mail-Berichtsmechanismus durchgehen, wenn irgendwo auf dieser Site ein Fehler auftritt. Anathema!

Eine Lösung wäre für uns an dieser Site, unsere eigene C ++ - Referenz zu entwickeln. Dies würde ziemlich viel Arbeit kosten. Wir müssten aufpassen, dass wir nicht zu pedantisch / zu technisch sind. Es ist offensichtlich, dass cplusplus.com mindestens einige technische Redakteure beschäftigt, die die Pedanten in Schach halten. Wir müssten die Informationen gut organisiert halten; Die FAQ hier sind nicht gut organisiert. Wir müssten auch sehr vorsichtig sein, um nicht zu viel direkt aus dem Standard herauszuspritzen; das ist illegal

David Hammen
quelle
7
Früher habe ich das alte cppreference.com häufig besucht, aber jetzt haben sie es zu etwas Wiki-artigem überarbeitet (kann es von allen bearbeitet werden?) ... und ich mag es nicht mehr wirklich. Ich finde, es ist schwer, wichtige Informationen zu sehen. Es fehlt nur die unmittelbare Befriedigung, die ich von cplusplus.com bekomme. Meiner Ansicht nach.
Kerrek SB
14
Whoa! Ich sehe genau das Gegenteil. Ich habe aufgehört, die alte cppreference.com zu besuchen, weil ich es schwierig fand, sie zu durchqueren und schlecht zu schreiben. Die neue Website cppreference.com scheint eine werbefreie, Community-basierte Website zu sein, die genau das tut, was ich in meinem letzten Absatz vorgeschlagen habe.
David Hammen
1
Vielleicht war es nur ich, ich werde es noch einmal versuchen. Ich glaube, ich wollte ein paar <thread>oder so nachschlagen <atomic>und habe gerade "Bitte schreibe diese Seite" bekommen, also habe ich aufgegeben. Lass mich nochmal nachsehen! Oh, C ++ 0x-Unterstützung wäre natürlich ein großer Bonus!
Kerrek SB
10
"Menschen, die in Glashäusern leben, sollten keine Steine ​​werfen." SO behauptet nicht, (teilweise) eine Bibliotheksreferenz für C ++ zu sein, wie dies cplusplus.com/reference tut. Wenn Leute hier Ansprüche geltend machen, zitieren sie den Standard, um sie zu sichern, oder wenn sie dies nicht tun, kommt jemand anderes und füllt aus. Wenn sie falsch liegen, können Sie sehen, wie sie funktionieren. Wenn cplusplus.com falsch ist, haben Sie gerade Code geschrieben, der bei einer anderen C ++ - Implementierung als der fehlschlägt, mit der der Autor die "detaillierte Beschreibung seiner Elemente" erstellt hat. Das Problem ist, dass cplusplus.com informell ist, aber so geschrieben wurde, dass es formal aussieht.
Steve Jessop
4
SO ist informell und so geschrieben, dass es informell aussieht. Wenn cplusplus.com kein genaues Dokumentations- / Referenzmaterial sein soll und ich irgendwo einen Haftungsausschluss verpasst habe, der fair genug ist, gehen Sie davon aus, dass Steine ​​auf die Personen geworfen werden, die ihn auf diese Weise verwenden, und nicht auf die Website selbst. Aber der Punkt ist, dass nur weil cplusplus.com etwas über eine C ++ - Funktion sagt, dies nicht bedeutet, dass es wahr ist, und es ist wichtig zu wissen, ob Sie es als Kurzreferenz verwenden möchten. Ich verwende es, um Funktionssignaturen nachzuschlagen, aber nie, um festzustellen, ob mein Code konform ist oder nicht.
Steve Jessop
14

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

Erwähnt nicht, dass "Wenn das Kopieren zwischen überlappenden Objekten stattfindet, ist das Verhalten undefiniert." (4.11.2.4 im C89-Standard. Ich habe keine Kopie von C90 zur Hand, worauf sich C ++ 03 tatsächlich bezieht, aber sie sollen sich nur in Sachen wie der Seitennummerierung unterscheiden.)

Steve Jessop
quelle
Ah, die alte C-Bibliothek ... schön.
Kerrek SB
6
Sie erwähnen destination and source shall not overlap.
Scharfschütze
2
@Sniper "darf sich nicht überlappen" ist nicht dasselbe wie "das Verhalten ist undefiniert". Ihr Kommentar beleuchtet tatsächlich einen der subtilen, allgegenwärtigen Fehler von cplusplus.com - er klingt richtig, ist aber nicht korrekt.
Andrew Henle
@Sniper: Ich denke, es hat wahrscheinlich nicht gesagt, dass ich bei dieser Antwort im Jahr 2011 "nicht überlappen" als ausreichende Einschränkung für die Eingaben genommen hätte.
Steve Jessop
9

Die von cplusplus.com bereitgestellte Dokumentation ist häufig falsch oder unvollständig.

Sobald ein solches Beispiel ist, ist die atoiDokumentation auf cplusplus.com.

atoi
Im Abschnitt Return wird der Rückgabewert 0 nicht erwähnt, wenn während der Verwendung der Funktion keine Konvertierung durchgeführt werden kann.

Der Rückgabeabschnitt von cplusplus.com lautet: "... Wenn der konvertierte Wert durch ein int außerhalb des Bereichs darstellbarer Werte liegt, führt dies zu undefiniertem Verhalten."

Dies ist gemäß dem Standard " Wenn der numerische Wert der Zeichenfolge nicht in int dargestellt werden kann, ist das Verhalten undefiniert " korrekt .

Der Abschnitt ist jedoch nicht voll, da 0 nicht als Rückgabewert angegeben wird, was irreführend sein kann. Der Satz "... es wird keine Konvertierung durchgeführt und Null wird zurückgegeben." wird zuvor im Beschreibungsabsatz erfüllt, es ist jedoch wichtig, dass es im Abschnitt " Zurück " enthalten ist.

Viele der auf cplusplus.com angegebenen Beispielquellcodes sind falsch.
Viele der Neulinge, die zu diesen Referenzen aufschauen, führen zu Ballantfehlern.

Um ein Beispiel zu nennen:

EDIT: Das Beispiel, das ich zuvor zitiert habe, war falsch.

Alok Speichern
quelle
5
Vielleicht ballant -> krass? Ballant ist jedoch ein französisches Wort für "baumeln", was für Fehler mit Zeigern geeignet sein könnte.
Hardmath
Lesen Sie das Iterator-Beispiel noch einmal ... es gibt kein undefiniertes Verhalten.
Dennis Zickefoose
1
Sie haben erklärt, dass viele der auf cplusplus.com angegebenen Beispielquellcodes falsch sind. und entfernte dann das Beispiel mit der Aufschrift "Das zuvor zitierte Beispiel war falsch." - Warum haben Sie das Beispiel dann entfernt? :)
user2962533
Laut dieser Site führt der von Ihnen beschriebene Fall zu einem undefinierten Rückgabetyp und nicht zu einem undefinierten Verhalten. en.cppreference.com/w/cpp/string/byte/atoi ; Es sieht jedoch so aus, als hätte Cplusplus.com seine Dokumentation entsprechend Ihren Aussagen aktualisiert. Offensichtlich reagieren sie auf Anfragen der Community nach Korrekturen. Trotzdem bin ich mir nicht sicher, welche Website am korrektesten ist, da die beiden fraglichen sehr unterschiedliche Dinge aussagen.
shawn1874
Es ist 9 Jahre her, seit diese Antwort veröffentlicht wurde. Wird allgemein immer noch angenommen, dass Cplusplus.com eine erhebliche Menge falscher oder unvollständiger Informationen enthält?
Tyler Shellberg
3

Die Dokumentation für type_infoversucht zuerst zu erklären typeid, schlägt jedoch fehl:

typeid kann direkt auf Typen angewendet werden. In diesem Fall gibt es seine Informationen zurück. Oder an Objekte. In diesem Fall werden Informationen zum Objekttyp zurückgegeben.

Wenn typeid auf einen dereferenzierten Zeiger auf ein Objekt eines polymorphen Klassentyps angewendet wird (eine Klasse, die eine virtuelle Funktion deklariert oder erbt), berücksichtigt sie ihren dynamischen Typ (dh den Typ des am meisten abgeleiteten Objekts).

Jetzt stimmt der zweite Absatz bereits nicht mehr mit dem ersten überein. In typeid(*ptr), typeidwird auf einen Ausdruck angewendet. Dies ist ziemlich wichtig, da der Begriff staticund die dynamicTypen nur im Kontext des Ausdrucks Sinn machen, nicht im Kontext von Objekten. Es fehlen auch Fälle wie typeid(foo()).

Darüber hinaus werden im zweiten Absatz Verweise weggelassen. Auch sie können statische Typen haben, die sich vom dynamischen Typ des Objekts unterscheiden, auf das sie verweisen.

MSalters
quelle
Sehr schön - RTTI-Fragen werden auf SO mit vorhersehbarer Regelmäßigkeit gestellt. Gut zu wissen, worauf man sich nicht beziehen soll.
Kerrek SB
3

Die Dokumentation von std::pair<T1,T2>::operator==besagt, dass beide Elemente auf Gleichheit geprüft werden. Die Dokumentation von std::pair<T1,T2>::operator<besagt, dass die zweiten Elemente nur berücksichtigt werden, wenn die ersten Elemente gleich sind.

In beiden Fällen erscheint das Wort "gleich". Doch nur im ersten Fall bedeutet es wirklich T::operator==. Im zweiten Fall bedeutet gleich!(a.first<b.first || b.first<a.first)

MSalters
quelle
Ist dies obligatorisch oder kann die Bibliothek operator==im zweiten Fall kostenlos verwendet werden, wenn der Operator verfügbar ist?
Kerrek SB
1
Verpflichtend. Der C ++ Standard mischt nicht operator==und operator<.
MSalters