Quel est le problème avec cplusplus.com?

201

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.

Kerrek SB
la source
62
Pourquoi les downvotes? C'est une question parfaitement valable. Si vous avez besoin d'une référence, vous voulez une source fiable. J'ai également entendu des plaintes contre cplusplus.com, où je peux obtenir une référence rapide pour la bibliothèque standard et en tant que telle, c'est intéressant.
Xeo
48
@Olafur: Je ne veux pas d'opinion, je veux des listes concrètes d'erreurs sur ce site. S'il n'y en a pas, je veux pouvoir utiliser cette question pour dissiper les futures critiques.
Kerrek SB
4
@ Ólafur Waage: peut-être. Mais des remarques parfaitement objectives peuvent être faites sur l'exactitude / la véracité du contenu de ce site Web.
Daniel Sloof
14
Nous sommes déjà à la première page de "cplusplus.com" sur Google. Il est impressionnant de voir à quelle vitesse les questions SO grimpent dans les classements de recherche.
Courses de légèreté en orbite le
5
Je pense qu'il est juste - étant donné le classement de cette question sur les recherches de "cplusplus" - de noter que, depuis que cette question a été posée, un certain nombre de corrections ont été apportées à cplusplus.com. En fait, les trois premières réponses qui signalent des erreurs ne sont plus vraies.
Mark H

Réponses:

72

Edit: la documentation de std::removea é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::removefonction de <algorithm>.

Le fait est que std::removecela ne supprime pas l'article du conteneur. C'est parce que ne std::removefonctionne 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 possible std::removede 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. Il std::removene 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 :

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

Mais cplusplus.comdonne des informations incorrectes sur std::remove. Ça dit

Notez que cette fonction ne modifie pas les éléments au-delà de la nouvelle fin, qui conservent leurs anciennes valeurs et sont toujours accessibles .

ce 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.comdonne également des informations incorrectes sur list::remove. Ça dit ,

Notez qu'une fonction d'algorithme global, remove, existe avec un comportement similaire mais fonctionnant entre deux itérateurs.

ce qui est complètement faux. La suppression globale à savoir std::removen'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.

Nawaz
la source
1
+1: y a-t-il beaucoup plus de ces déclarations incorrectes sur ce site?
Klaim
4
@Alexander: list::removesupprime les éléments du conteneur. Mais std::removene supprime PAS les éléments du conteneur. Je ne peux pas dire que leur comportement est "similaire".
Nawaz
3
Belle prise! C'est un très bon exemple de ce que je recherche.
Kerrek SB
3
«Similaire» est discutable, car il s'agit de savoir si deux opérations différentes sont similaires ou non. Il est également discutable que cplusplus.com doive offrir une opinion déguisée en documentation. Mais de toute façon, "garder leurs anciennes valeurs" est une erreur impardonnable, cela montre simplement que la description de cplusplus n'était pas basée sur la norme.
Steve Jessop
5
@Steve: Vous avez dit "Similar" is debateable. Si le mot similarest 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 de std::removeet list::remove, parce qu'une explication doit être aussi claire que possible, elle ne devrait pas nécessiter une autre explication.
Nawaz
38

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.

David Hammen
la source
7
J'avais l'habitude de fréquenter l'ancien cppreference.com, mais maintenant ils l'ont retravaillé en quelque chose de wiki-ish (est-il ouvert à l'édition par tout le monde?) ... et je ne l'aime plus vraiment. Il est difficile de voir les informations importantes, je trouve. Il manque juste la gratification immédiate que je reçois de cplusplus.com. Je pense.
Kerrek SB
14
Whoa! Je vois exactement le contraire. J'ai arrêté de fréquenter l'ancien cppreference.com car j'ai eu du mal à parcourir et mal écrit. Le nouveau cppreference.com semble être un site communautaire sans publicité qui fait exactement ce que j'ai suggéré dans mon dernier paragraphe.
David Hammen
1
Peut-être que c'était juste moi, je vais essayer à nouveau. Je pense que je voulais chercher certains <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!
Kerrek SB
10
"Les gens qui vivent dans des maisons en verre ne devraient pas jeter de pierres." SO ne prétend pas être (en partie) une référence de bibliothèque pour C ++ comme cplusplus.com/reference . Quand les gens font des réclamations ici, ils citent la norme pour les soutenir, ou s'ils ne le font pas, alors quelqu'un d'autre vient et remplit. S'ils ont tort, vous pouvez voir leur travail. Si cplusplus.com est erroné, vous venez d'écrire du code qui échouera sur une implémentation C ++ autre que celle que l'auteur a utilisée pour produire la "description détaillée de ses éléments". Le problème est que cplusplus.com est informel, mais écrit pour avoir l'air formel.
Steve Jessop
4
SO est informel et écrit pour paraître informel. Maintenant, si cplusplus.com n'est pas destiné à être une documentation / un matériau de référence précis et que j'ai manqué un avertissement quelque part, alors assez juste, supposez que des pierres soient lancées sur les personnes qui l'utilisent de cette façon plutôt que sur le site lui-même. Mais le fait est que ce n'est pas parce que cplusplus.com dit quelque chose à propos d'une fonction C ++, et cela vaut la peine de savoir que si vous prévoyez de l'utiliser comme référence rapide. Je l'utilise pour rechercher des signatures de fonction, mais jamais pour régler un point fin si mon code est conforme ou non.
Steve Jessop
14

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.)

Steve Jessop
la source
Ah, l'ancienne bibliothèque C ... sympa.
Kerrek SB
6
Ils mentionnent destination and source shall not overlap.
Sniper
2
@Sniper "ne doit pas se chevaucher" n'est pas la même chose que "le comportement n'est pas défini". Votre commentaire éclaire en fait l'un des défauts subtils et omniprésents de cplusplus.com - il semble juste, mais ce n'est pas correct.
Andrew Henle
@Sniper: Je pense qu'il n'a probablement pas dit que lorsque j'ai fait cette réponse en 2011. J'aurais pris "ne se chevauchent pas" comme une contrainte suffisante sur les entrées.
Steve Jessop
9

La documentation fournie par cplusplus.com est souvent incorrecte ou incomplète.

Une fois que cet exemple est, la atoidocumentation 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.

Alok Save
la source
5
Peut-être ballant -> flagrant? Cependant ballant est un mot français pour "balancer", qui pourrait être à propos d'erreurs impliquant des pointeurs.
hardmath
Relisez cet exemple d'itérateur ... il n'y a pas de comportement indéfini.
Dennis Zickefoose
1
Vous avez déclaré "La plupart des exemples de codes source fournis sur cplusplus.com sont incorrects." puis supprimé l'exemple disant "L'exemple que j'ai cité précédemment était incorrect". - Pourquoi avez-vous supprimé l'exemple, alors? :)
user2962533
Selon ce site, le cas que vous décrivez entraîne un type de retour non défini et non un comportement non défini. en.cppreference.com/w/cpp/string/byte/atoi ; cependant, il semble que Cplusplus.com ait mis à jour sa documentation pour correspondre à ce que vous dites. De toute évidence, ils répondent aux demandes de correction de la communauté. Néanmoins, je ne sais pas quel site Web est le plus correct car les deux en question énoncent des choses très différentes.
shawn1874
Cela fait 9 ans que cette réponse a été publiée. Est-il toujours généralement admis que Cplusplus.com contient une quantité importante d'informations incorrectes ou incomplètes?
Tyler Shellberg
3

La documentation de type_infoessaie d'expliquer d' typeidabord, mais échoue:

typeid peut être appliqué directement aux types, auquel cas il renvoie ses informations; Ou aux objets, auquel cas il renvoie des informations sur le type de l'objet.

Lorsque typeid est appliqué à un pointeur déréférencé sur un objet d'un type de classe polymorphe (une classe déclarant ou héritant d'une fonction virtuelle), il considère son type dynamique (c'est-à-dire le type de l'objet le plus dérivé).

Maintenant, le deuxième paragraphe est déjà en désaccord avec le premier. Dans typeid(*ptr), typeidest appliqué à une expression. C'est assez essentiel, car la notion de staticet les dynamictypes n'ont de sens que dans le contexte de l'expression, pas des objets. Il manque également des cas comme typeid(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.

MSalters
la source
Très bien - les questions RTTI viennent sur SO avec une régularité prévisible. Bon de savoir quoi ne pas faire référence.
Kerrek SB
3

La documentation de std::pair<T1,T2>::operator==dit que les deux éléments sont testés pour l'égalité. La documentation de std::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)

MSalters
la source
Est-ce obligatoire ou la bibliothèque est-elle libre d'utiliser operator==dans le second cas si l'opérateur est disponible?
Kerrek SB
1
Obligatoire. La norme C ++ ne mélange pas operator==et operator<.
MSalters