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.
Antworten:
Bearbeiten: Die Dokumentation für
std::remove
wurde behoben, seit diese Antwort geschrieben wurde. Gleiches gilt fürlist::remove
.Lassen Sie mich Ihnen ein Beispiel geben, um Ihnen zu zeigen, wie cpluscplus.com etwas falsch machen kann.
Betrachten Sie die
std::remove
Funktion von<algorithm>
.Tatsache ist, dass
std::remove
der Artikel nicht aus dem Container entfernt wird. Sein , weilstd::remove
Arbeiten mit einem Paar von Iteratoren nur und nichts über die Container wissen , welche die Elemente tatsächlich enthalten. Tatsächlich ist es nicht möglichstd::remove
, den zugrunde liegenden Container zu kennen, da es unmöglich ist, von zwei Iteratoren aus herauszufinden, zu welchem Container die Iteratoren gehören. Sostd::remove
entfernen 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 :
Aber
cplusplus.com
gibt falsche Informationen überstd::remove
. Es sagtdas 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.com
gibt es auch falsche Informationen überlist::remove
. Es heißt :das ist völlig falsch. Das globale Entfernen ist nämlich
std::remove
nicht ähnlichlist::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.
quelle
list::remove
die Elemente aus dem Container. Entferntstd::remove
aber NICHT die Elemente aus dem Container. Ich kann nicht sagen, dass ihr Verhalten "ähnlich" ist."Similar" is debateable
. Wenn das Wortsimilar
umstritten ist, dann sagt es sehr viel, dass dieses Wort nicht das richtige Wort ist und sollte vermieden werden, wenn das Verhalten vonstd::remove
und erklärt wirdlist::remove
, da eine Erklärung so klar wie möglich sein sollte, sollte es keine weitere Erklärung erfordern.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
quelle
<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!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.)
quelle
destination and source shall not overlap
.Die von cplusplus.com bereitgestellte Dokumentation ist häufig falsch oder unvollständig.
Sobald ein solches Beispiel ist, ist die
atoi
Dokumentation 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.
quelle
Die Dokumentation für
type_info
versucht zuerst zu erklärentypeid
, schlägt jedoch fehl:Jetzt stimmt der zweite Absatz bereits nicht mehr mit dem ersten überein. In
typeid(*ptr)
,typeid
wird auf einen Ausdruck angewendet. Dies ist ziemlich wichtig, da der Begriffstatic
und diedynamic
Typen nur im Kontext des Ausdrucks Sinn machen, nicht im Kontext von Objekten. Es fehlen auch Fälle wietypeid(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.
quelle
Die Dokumentation von
std::pair<T1,T2>::operator==
besagt, dass beide Elemente auf Gleichheit geprüft werden. Die Dokumentation vonstd::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)
quelle
operator==
im zweiten Fall kostenlos verwendet werden, wenn der Operator verfügbar ist?operator==
undoperator<
.