Cosa c'è che non va in cplusplus.com?


201

Questo non è forse un forum perfettamente adatto a questa domanda, ma lasciami fare un tentativo, a rischio di essere spostato.

Esistono diversi riferimenti per la libreria standard C ++, tra cui l'inestimabile standard ISO, MSDN , IBM , cppreference e cplusplus . Personalmente, quando scrivo C ++ ho bisogno di un riferimento che abbia un accesso casuale rapido, brevi tempi di caricamento ed esempi di utilizzo, e ho trovato molto utile cplusplus.com. Tuttavia, ho sentito spesso opinioni negative su quel sito Web qui su SO, quindi vorrei essere specifico:

Quali sono gli errori, le idee sbagliate o i cattivi consigli forniti da cplusplus.com? Quali sono i rischi del suo utilizzo per prendere decisioni sulla codifica?

Consentitemi di aggiungere questo punto: voglio essere in grado di rispondere alle domande qui su SO con virgolette accurate dello standard, e quindi vorrei pubblicare link immediatamente utilizzabili, e cplusplus.com sarebbe stato il mio sito preferito se non fosse per questa edizione.


62
Perché i downvotes? Questa è una domanda perfettamente valida. Se hai bisogno di un riferimento, vuoi una fonte attendibile. Ho anche sentito lamentele contro cplusplus.com, dove posso ottenere un rapido riferimento per la libreria standard e come tale, questo è interessante.
Xeo,

48
@Olafur: non voglio un'opinione, voglio elenchi concreti di errori su quel sito. Se non ce ne sono, voglio essere in grado di usare questa domanda per dissipare le critiche future.
Kerrek SB,

4
@ Ólafur Waage: forse. Ma si possono fare punti perfettamente oggettivi sull'accuratezza / veridicità dei contenuti di quel sito web.
Daniel Sloof,

14
Siamo già nella prima pagina di "cplusplus.com" su Google. È impressionante la rapidità con cui le domande SO salgono le classifiche di ricerca.
Razze di leggerezza in orbita,

5
Penso che sia giusto - vista la posizione di questa domanda nelle ricerche di "cplusplus" - notare che, da quando è stata posta questa domanda, sono state apportate alcune correzioni a cplusplus.com. In effetti, le prime tre risposte che indicano errori non sono più vere.
Mark H,

Risposte:


72

Modifica: la documentazione per std::removeè stata corretta da quando è stata scritta questa risposta. La stessa cosa vale per list::remove.

Lascia che ti faccia un esempio per mostrarti come cpluscplus.com può sbagliare.

Considera la std::removefunzione da <algorithm>.

Il fatto è che std::removenon rimuove l'elemento dal contenitore. È perché std::removefunziona solo con una coppia di iteratori e non sa nulla del contenitore che contiene effettivamente gli elementi. In effetti, non è possibile std::removeconoscere il contenitore sottostante, poiché non è possibile che una coppia di iteratori riesca a scoprire il contenitore a cui appartengono gli iteratori. Quindi std::removenon rimuove davvero gli oggetti, semplicemente perché non può . L'unico modo per effettivamente rimuovere un elemento da un contenitore è invocare una funzione membro su quel contenitore.

Quindi, se vuoi rimuovere gli elementi, usa Erase-Remove Idiom :

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

Ma cplusplus.comfornisce informazioni errate su std::remove. Dice

Si noti che questa funzione non altera gli elementi oltre il nuovo fine, che mantengono i loro vecchi valori e sono ancora accessibili .

che non è corretto. L'iteratore nell'intervallo [new_end, old_end)è ancora dichiarabile, ma ciò NON significa che mantengano i vecchi valori e siano ancora accessibili. Non sono specificati.


Allo stesso modo, cplusplus.comfornisce anche informazioni erratelist::remove . Si dice ,

Si noti che esiste una funzione di algoritmo globale, rimuovere, con un comportamento simile ma operante tra due iteratori.

che è completamente sbagliato. La rimozione globale, in particolare, std::removenon è simile a list::remove, poiché abbiamo visto che la prima NON rimuove realmente gli elementi dal contenitore perché non può , mentre la seconda (la funzione membro) rimuove davvero gli elementi perché può .

Questa risposta viene copiata dalla mia altra risposta nel seguente argomento, con poche modifiche:

Nota: da quando mi sono imbattuto recentemente in questo quando stavo rispondendo all'argomento sopra, me lo ricordo. Ci sono molti errori che ho riscontrato negli ultimi due anni, che non ricordo. Potrei aggiungerne altri in seguito, se dovessi imbattermi di nuovo.


1
+1: ci sono molte più di quelle affermazioni errate su questo sito?
Klaim

4
@Alexander: list::removerimuove gli elementi dal contenitore. Ma std::removeNON rimuove gli elementi dal contenitore. Non posso dire che il loro comportamento sia "simile".
Nawaz,

3
Bella presa! Questo è un ottimo esempio delle cose che sto cercando.
Kerrek SB,

3
"Simile" è discutibile, dal momento che è una questione di opinione se due diverse operazioni sono simili o meno. È anche discutibile se cplusplus.com debba offrire un'opinione mascherata da documentazione. Comunque, "mantenere i loro vecchi valori" è un errore imperdonabile, mostra solo che la descrizione di cplusplus non era basata sullo standard.
Steve Jessop,

5
@Steve: hai detto "Similar" is debateable. Se la parola similarè discutibile, allora dice molto che questa parola non è la parola corretta e dovrebbe essere evitata quando si spiega il comportamento di std::removee list::remove, poiché una spiegazione dovrebbe essere il più chiara possibile, non dovrebbe richiedere un'altra spiegazione.
Nawaz,

38

Offrirò un parere leggermente contrario. Ci sono molte buone informazioni su cplusplus.com. Sceglilo a morte, e sì, certo che ha i suoi problemi, ma quale sito no? Certamente non questo sito . Le persone che vivono nelle case di vetro non dovrebbero lanciare pietre. Anche qui c'è molta disinformazione. Ci sono risposte accettate che sono assolutamente sbagliate, risposte declassate (alcune negative!) Che sono perfettamente corrette.

Un problema con cplusplus.com è che si tratta di un sito chiuso; lo stesso vale per la maggior parte degli altri siti di riferimento citati. Questo va contro il grano di un sito sviluppato dalla comunità come Stack Overflow. L'acquisizione della possibilità di apportare modifiche affidabili non richiede così tanto tempo e anche il più recente dei neofiti può facilmente suggerire miglioramenti. Confrontalo con cplusplus.com. Sei un principiante perpetuo se non fai parte del loro staff. Anche se sei un membro chiave di WG21, devi seguire il meccanismo di segnalazione e-mail se vedi un bug da qualche parte in quel sito. Anatema!

Una soluzione sarebbe per noi in questo sito per sviluppare il nostro riferimento C ++. Ciò richiederebbe un po 'di lavoro. Dovremmo stare attenti a non essere troppo pedanti / troppo tecnici; è ovvio che cplusplus.com impiega almeno alcuni redattori tecnici che tengono a bada i pedanti. Dovremmo mantenere le informazioni ben organizzate; le FAQ qui non sono ben organizzate. Dovremmo anche stare molto attenti a non spargere troppo direttamente dallo standard; è illegale.


7
Frequentavo il vecchio cppreference.com, ma ora lo hanno rielaborato in qualcosa di wiki-ish (è aperto a tutti?) ... e non mi piace più. Trovo difficile vedere le informazioni importanti. Manca solo la gratificazione immediata che ottengo da cplusplus.com. Penso.
Kerrek SB,

14
Whoa! Vedo l'esatto contrario. Ho smesso di frequentare il vecchio cppreference.com perché trovavo difficile attraversarlo e scritto male. Il nuovo cppreference.com sembra essere un sito privo di pubblicità e basato sulla comunità che fa esattamente ciò che ho suggerito nel mio ultimo paragrafo.
David Hammen,

1
Forse sono stato solo io, ci proverò ancora. Penso di voler cercare qualcosa <thread>o <atomic>cose e ho appena ricevuto "per favore, scrivi questa pagina", quindi ho rinunciato. Fammi controllare di nuovo! Oh, il supporto C ++ 0x sarebbe ovviamente un vantaggio enorme!
Kerrek SB,

10
"Le persone che vivono nelle case di vetro non dovrebbero lanciare pietre." SO non afferma di essere (in parte) un riferimento alla libreria per C ++ come cplusplus.com/reference . Quando le persone fanno affermazioni qui, citano lo standard per eseguirne il backup o, in caso contrario, qualcun altro arriva e riempie. Se si sbagliano, puoi vedere il loro funzionamento. Se cplusplus.com è sbagliato, hai appena scritto un codice che fallirà su un'implementazione C ++ diversa da quella utilizzata dall'autore per produrre la "descrizione dettagliata dei suoi elementi". Il problema è che cplusplus.com è informale, ma scritto per sembrare formale.
Steve Jessop,

4
SO è informale e scritto per sembrare informale. Ora, se cplusplus.com non è destinato ad essere documentazione / materiale di riferimento accurati e ho perso un disclaimer da qualche parte, allora abbastanza giusto, supponiamo che vengano lanciate pietre contro le persone che lo usano in questo modo piuttosto che sul sito stesso. Ma il punto è che solo perché cplusplus.com dice qualcosa su una funzione C ++ non significa che sia vero, e vale la pena sapere che se hai intenzione di usarlo come riferimento rapido. Lo uso per cercare le firme delle funzioni, ma non per stabilire mai un punto preciso se il mio codice è conforme o meno.
Steve Jessop,

14

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

Non riesce a menzionare che "Se la copia avviene tra oggetti che si sovrappongono, il comportamento non è definito." (4.11.2.4 nello standard C89. Non ho una copia a portata di mano di C90, che è ciò a cui effettivamente fa riferimento C ++ 03, ma dovrebbero differire solo per cose come la numerazione delle pagine.)


Ah, la vecchia biblioteca C ... carina.
Kerrek SB,

6
Citano destination and source shall not overlap.
Sniper,

2
@Sniper "non deve sovrapporsi" non è uguale a "il comportamento non è definito". Il tuo commento in realtà illumina uno dei fallimenti sottili e pervasivi di cplusplus.com - suona bene, ma non è corretto.
Andrew Henle,

@Sniper: penso che probabilmente non abbia detto che quando ho fatto questa risposta nel 2011. Avrei preso "non si sovrapporranno" come vincolo sufficiente per gli input.
Steve Jessop,

9

La documentazione fornita da cplusplus.com è spesso errata o incompleta.

Una volta che tale esempio è, la atoidocumentazione su cplusplus.com.

atoi
Nella sezione Return, non è possibile menzionare il valore 0 return se non è possibile eseguire alcuna conversione durante l'utilizzo della funzione.

cplusplus.com Restituisce la sezione dichiara "... Se il valore convertito sarebbe fuori dall'intervallo di valori rappresentabili da un int, provoca un comportamento indefinito."

Questo è corretto, secondo lo standard " Se il valore numerico della stringa non può essere rappresentato in int, il comportamento non è definito ".

Tuttavia, la sezione non è piena in quanto non menziona 0 come valore di ritorno, che può essere fuorviante. La frase "... nessuna conversione viene eseguita e viene restituito zero". è incontrato prima nel paragrafo descrizione, ma è essenziale averlo nella sezione Ritorno .

Molti dei codici sorgente di esempio forniti su cplusplus.com non sono corretti.
Molti dei neofiti che guardano a questi riferimenti sono portati a fare errori ballant.

Per citare un esempio:

EDIT: L'esempio che ho citato in precedenza non era corretto.


5
Forse ballant -> palese? Tuttavia ballant è una parola francese per "penzolare", che potrebbe essere a favore di errori che coinvolgono puntatori.
Hardmath,

Rileggi quell'esempio di iteratore ... non esiste un comportamento indefinito.
Dennis Zickefoose,

1
Hai dichiarato "Molti dei codici sorgente di esempio forniti su cplusplus.com sono errati." e poi rimosso l'esempio dicendo "L'esempio che ho citato in precedenza era errato". - Perché hai rimosso l'esempio, allora? :)
user2962533

Secondo questo sito, il caso che descrivi provoca un comportamento di ritorno non definito non definito. en.cppreference.com/w/cpp/string/byte/atoi ; tuttavia, sembra che Cplusplus.com abbia aggiornato la sua documentazione in modo che corrisponda a ciò che stai dicendo. Evidentemente rispondono alle richieste della comunità di correzioni. Tuttavia, non sono sicuro di quale sito Web sia più corretto perché i due in questione affermano cose molto diverse.
shawn1874

Sono passati 9 anni da quando questa risposta è stata pubblicata. Si ritiene ancora generalmente che Cplusplus.com contenga una quantità significativa di informazioni errate o incomplete?
Tyler Shellberg

3

La documentazione per type_infotenta di spiegare typeidprima, ma non riesce:

typeid può essere applicato direttamente ai tipi, nel qual caso restituisce le sue informazioni; O agli oggetti, nel qual caso restituisce informazioni sul tipo di oggetto.

Quando typeid viene applicato a un puntatore senza riferimenti a un oggetto di un tipo di classe polimorfica (una classe che dichiara o eredita una funzione virtuale), considera il suo tipo dinamico (cioè il tipo dell'oggetto più derivato).

Ora il secondo paragrafo non è già d'accordo con il primo. Neltypeid(*ptr) , typeidviene applicato a un'espressione. Questo è piuttosto essenziale, poiché la nozione di statice dynamictipi ha senso solo nel contesto dell'espressione, non degli oggetti. Manca anche casi cometypeid(foo()) .

Inoltre, il secondo paragrafo omette i riferimenti. Anche loro possono avere tipi statici diversi dal tipo dinamico dell'oggetto a cui fanno riferimento.


Molto bello - le domande di RTTI si presentano su SO con regolarità prevedibile. Buono a sapersi cosa non fare riferimento.
Kerrek SB,

3

La documentazione di std::pair<T1,T2>::operator==dice che entrambi gli elementi sono testati per l'uguaglianza. La documentazione distd::pair<T1,T2>::operator< dice che i secondi elementi sono considerati solo se i primi elementi sono uguali.

La parola "uguale" appare in entrambi i casi. Tuttavia, solo nel primo caso significa davvero T::operator==. Nel secondo caso, mezzi uguali!(a.first<b.first || b.first<a.first)


È obbligatorio o la libreria può essere utilizzata gratuitamente operator==nel secondo caso se l'operatore è disponibile?
Kerrek SB,

1
Obbligatorio. Lo standard C ++ non si mescola operator==e operator<.
MSalters,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.