Ce n'est peut-être pas un forum parfaitement adapté à cette question, mais permettez-moi de l'essayer, au risque d'être éloigné.
Il existe plusieurs références pour la bibliothèque standard C ++, notamment la précieuse norme ISO, MSDN , IBM , cppreference et cplusplus . Personnellement, lors de l'écriture de C ++, j'ai besoin d'une référence qui dispose d'un accès aléatoire rapide, de temps de chargement courts et d'exemples d'utilisation, et j'ai trouvé cplusplus.com assez utile. Cependant, j'ai souvent entendu des opinions négatives sur ce site Web sur SO, donc je voudrais être précis:
Quelles sont les erreurs, les idées fausses ou les mauvais conseils donnés par cplusplus.com? Quels sont les risques de l'utiliser pour prendre des décisions de codage?
Permettez-moi d'ajouter ce point: je veux pouvoir répondre aux questions ici sur SO avec des citations précises de la norme, et donc je voudrais publier des liens immédiatement utilisables, et cplusplus.com aurait été mon site de choix sans ce problème.
Réponses:
Edit: la documentation de
std::remove
a été corrigée depuis la rédaction de cette réponse. La même chose s'applique àlist::remove
.Permettez-moi de vous donner un exemple pour vous montrer comment cpluscplus.com peut se tromper.
Considérez la
std::remove
fonction de<algorithm>
.Le fait est que
std::remove
cela ne supprime pas l'article du conteneur. C'est parce que nestd::remove
fonctionne qu'avec une paire d'itérateurs et ne sait rien du conteneur qui contient réellement les éléments. En fait, il n'est pas possiblestd::remove
de connaître le conteneur sous-jacent, car il est impossible de passer d'une paire d'itérateurs pour découvrir le conteneur auquel les itérateurs appartiennent. Ilstd::remove
ne supprime donc pas vraiment les éléments, simplement parce qu'il ne le peut pas . La seule façon de supprimer réellement un élément d'un conteneur est d'appeler une fonction membre sur ce conteneur.Donc, si vous souhaitez supprimer les éléments, utilisez alors Erase-Remove Idiom :
Mais
cplusplus.com
donne des informations incorrectes surstd::remove
. Ça ditce qui n'est pas correct. L'itérateur de la plage
[new_end, old_end)
est toujours déréférençable, mais cela ne signifie PAS qu'ils conservent les anciennes valeurs et sont toujours accessibles. Ils ne sont pas spécifiés.De même,
cplusplus.com
donne également des informations incorrectes surlist::remove
. Ça dit ,ce qui est complètement faux. La suppression globale à savoir
std::remove
n'est pas similaire àlist::remove
, car nous avons vu que la première ne supprime PAS vraiment les éléments du conteneur car elle ne le peut pas , tandis que la seconde (la fonction membre) supprime vraiment les éléments parce qu'elle le peut .Cette réponse est copiée de ma autre réponse dans le sujet suivant, avec peu de modifications:
Remarque: Depuis que je suis tombé sur ce sujet récemment alors que je répondais dans le sujet ci-dessus, je m'en souviens. Il y a beaucoup d'erreurs que j'ai rencontrées au cours des deux dernières années, dont je ne me souviens pas. Je pourrais en ajouter quelques autres plus tard, si je reviens.
la source
list::remove
supprime les éléments du conteneur. Maisstd::remove
ne supprime PAS les éléments du conteneur. Je ne peux pas dire que leur comportement est "similaire"."Similar" is debateable
. Si le motsimilar
est discutable, il indique très bien que ce mot n'est pas le mot correct et doit être évité lors de l'explication du comportement destd::remove
etlist::remove
, parce qu'une explication doit être aussi claire que possible, elle ne devrait pas nécessiter une autre explication.Je vais donner un avis légèrement contraire. Il y a beaucoup de bonnes informations sur cplusplus.com. Choisissez-le à mort, et oui, bien sûr, il a ses problèmes, mais quel site n'en a pas? Certainement pas ce site . Les gens qui vivent dans des maisons en verre ne devraient pas jeter de pierres. Il y a aussi beaucoup de désinformation ici. Il y a des réponses acceptées qui sont carrément erronées, des réponses votées (certaines négatives!) Qui sont correctes.
Un problème avec cplusplus.com est qu'il s'agit d'un site fermé; il en va de même pour la plupart des autres sites de référence mentionnés. Cela va à l'encontre d'un site développé par la communauté tel que Stack Overflow. L'acquisition de la capacité de faire des modifications de confiance ne prend pas beaucoup de temps, et même le plus nouveau des débutants peut facilement faire des suggestions d'amélioration. Comparez cela à cplusplus.com. Vous êtes un débutant perpétuel si vous ne faites pas partie de leur personnel. Même si vous êtes un membre clé de WG21, vous devez passer par leur mécanisme de rapport par e-mail si vous voyez un bogue quelque part sur ce site. Anathème!
Une solution serait pour nous sur ce site de développer notre propre référence C ++. Cela prendrait pas mal de travail. Il faudrait faire attention à ne pas être trop pédant / trop technique; il est évident que cplusplus.com emploie au moins quelques éditeurs techniques qui tiennent les pédants à distance. Il faudrait garder les informations bien organisées; les FAQ ici ne sont pas bien organisées. Il faudrait aussi faire très attention à ne pas trop jaillir directement de la norme; c'est illégal.
la source
<thread>
ou des<atomic>
trucs et je viens de recevoir "veuillez écrire cette page" alors j'ai abandonné. Laissez-moi vérifier à nouveau! Oh, le support C ++ 0x serait bien sûr un énorme bonus!http://www.cplusplus.com/reference/clibrary/cstring/strncpy/
Ne mentionne pas que "si la copie a lieu entre des objets qui se chevauchent, le comportement n'est pas défini". (4.11.2.4 dans la norme C89. Je n'ai pas de copie en main de C90, ce à quoi C ++ 03 fait référence, mais ils ne sont censés différer que par des choses comme la numérotation des pages.)
la source
destination and source shall not overlap
.La documentation fournie par cplusplus.com est souvent incorrecte ou incomplète.
Une fois que cet exemple est, la
atoi
documentation sur cplusplus.com.atoi
Dans la section Retour, il n'est pas fait mention d'environ 0 valeur de retour si aucune conversion ne peut être effectuée lors de l'utilisation de la fonction.
cplusplus.com La section de retour indique "... Si la valeur convertie est hors de la plage des valeurs représentables par un int, cela provoque un comportement indéfini."
C'est correct, selon la norme " Si la valeur numérique de la chaîne ne peut pas être représentée en entier, alors le comportement n'est pas défini ".
Cependant, la section n'est pas pleine car elle ne mentionne pas 0 comme valeur de retour, ce qui peut être trompeur. La phrase "... aucune conversion n'est effectuée et zéro est renvoyé." est rencontré avant dans le paragraphe de description, mais il est essentiel de l'avoir dans la section Retour .
De nombreux exemples de codes source fournis sur cplusplus.com sont incorrects.
Beaucoup de débutants qui recherchent ces références sont amenés à commettre des erreurs flagrantes.
Pour citer un exemple:
EDIT: L'exemple que j'ai cité précédemment était incorrect.
la source
La documentation de
type_info
essaie d'expliquer d'typeid
abord, mais échoue:Maintenant, le deuxième paragraphe est déjà en désaccord avec le premier. Dans
typeid(*ptr)
,typeid
est appliqué à une expression. C'est assez essentiel, car la notion destatic
et lesdynamic
types n'ont de sens que dans le contexte de l'expression, pas des objets. Il manque également des cas commetypeid(foo())
.De plus, le deuxième paragraphe omet les références. Eux aussi peuvent avoir des types statiques différents du type dynamique de l'objet qu'ils référencent.
la source
La documentation de
std::pair<T1,T2>::operator==
dit que les deux éléments sont testés pour l'égalité. La documentation destd::pair<T1,T2>::operator<
dit que les seconds éléments ne sont considérés que si les premiers éléments sont égaux.Le mot «égal» apparaît dans les deux cas. Pourtant, ce n'est que dans le premier cas que cela signifie vraiment
T::operator==
. Dans le second cas, des moyennes égales!(a.first<b.first || b.first<a.first)
la source
operator==
dans le second cas si l'opérateur est disponible?operator==
etoperator<
.