To może nie jest idealnie odpowiednie forum na to pytanie, ale pozwólcie, że spróbuję, ryzykując odejście.
Istnieje kilka odniesień do standardowej biblioteki C ++, w tym nieoceniony standard ISO, MSDN , IBM , cppreference i cplusplus . Osobiście, kiedy piszę C ++, potrzebuję referencji, która ma szybki dostęp losowy, krótkie czasy ładowania i przykłady użycia, a cplusplus.com uważam za bardzo użyteczny. Jednak często słyszę negatywne opinie na temat tej witryny tutaj, na SO, więc chciałbym uzyskać konkretne:
Jakie są błędy, nieporozumienia lub złe porady udzielone przez cplusplus.com? Jakie ryzyko wiąże się z użyciem go do podejmowania decyzji dotyczących kodowania?
Pozwólcie, że dodam ten punkt: chcę móc odpowiedzieć na pytania tutaj na SO z dokładnymi cytatami standardu, dlatego chciałbym zamieścić linki, które można natychmiast wykorzystać, a cplusplus.com byłaby moją ulubioną witryną, gdyby nie ten przypadek.
Odpowiedzi:
Edycja: Dokumentacja dla
std::remove
została naprawiona od czasu napisania tej odpowiedzi. To samo dotyczylist::remove
.Pozwól, że podam przykład pokazujący, jak cpluscplus.com może to zrobić źle.
Rozważ
std::remove
funkcję od<algorithm>
.Faktem jest, że
std::remove
nie usuwa przedmiotu z pojemnika. Jest tak, ponieważstd::remove
działa tylko z parą iteratorów i nie wie nic o kontenerze, który faktycznie zawiera elementy. W rzeczywistości nie jest możliwestd::remove
poznanie podstawowego kontenera, ponieważ nie ma możliwości, aby para iteratorów odkryła kontener, do którego należą iteratory. Więcstd::remove
tak naprawdę nie usuwa przedmiotów, po prostu dlatego, że nie może . Jedynym sposobem na faktyczne usunięcie elementu z kontenera jest wywołanie funkcji członka na tym kontenerze.Więc jeśli chcesz usunąć elementy, użyj Erase-Remove Idiom :
Ale
cplusplus.com
podaje nieprawidłowe informacje na tematstd::remove
. To mówico nie jest poprawne. Iterator w zakresie
[new_end, old_end)
jest nadal dereferencyjny, ale to wcale nie znaczy, że zachowują stare wartości i są nadal dostępne. Są nieokreślone.Podobnie
cplusplus.com
podaje również nieprawidłowe informacje na tematlist::remove
. Mówi :co jest całkowicie błędne. Globalne usunięcie mianowicie
std::remove
nie jest podobnelist::remove
, jak widzieliśmy, że ten pierwszy NIE usuwa rzeczy z kontenera, ponieważ nie może , podczas gdy drugi (funkcja członka) naprawdę usuwa elementy, ponieważ może .Ta odpowiedź została skopiowana z mojej innej odpowiedzi w następującym temacie, z niewielkimi modyfikacjami:
Uwaga: odkąd ostatnio na to natrafiłem, odpowiadając na powyższy temat, pamiętam to. W ciągu ostatnich dwóch lat napotkałem wiele błędów, których nie pamiętam. Mogę dodać kilka później, jeśli znów się spotkam.
źródło
list::remove
usuwa elementy z pojemnika. Alestd::remove
NIE usuwa elementów z pojemnika. Nie mogę powiedzieć, że ich zachowanie jest „podobne”."Similar" is debateable
. Jeśli słowosimilar
jest dyskusyjne, to bardzo mówi, że to słowo nie jest poprawnym słowem i należy go unikać, wyjaśniając zachowanie,std::remove
alist::remove
ponieważ wyjaśnienie powinno być jak najbardziej jasne, nie powinno wymagać innego wyjaśnienia.Mam zamiar zaoferować opinię nieco przeciwną. Istnieje wiele dobrych informacji na cplusplus.com. Wybierz to na śmierć i tak, oczywiście, że ma swoje problemy, ale która strona nie? Na pewno nie ta strona . Ludzie mieszkający w szklanych domach nie powinni rzucać kamieniami. Jest tu również wiele dezinformacji. Są akceptowane odpowiedzi, które są całkowicie błędne, odrzucone (niektóre negatywne!), Które są trafne.
Jednym z problemów z cplusplus.com jest to, że jest to zamknięta strona; to samo dotyczy większości innych wspomnianych witryn referencyjnych. Jest to sprzeczne z założeniami witryny opracowanej przez społeczność, takiej jak Przepełnienie stosu. Zdobycie możliwości dokonywania zaufanych edycji nie trwa tak długo, a nawet nowi nowicjusze mogą łatwo zaproponować ulepszenia. Porównaj to z cplusplus.com. Jesteś wiecznym nowicjuszem, jeśli nie jesteś w ich personelu. Nawet jeśli jesteś kluczowym członkiem WG21, musisz przejrzeć ich mechanizm zgłaszania wiadomości e-mail, jeśli zauważysz błąd gdzieś na tej stronie. Anatema!
Na tej stronie byłoby dla nas rozwiązaniem opracowanie własnego odniesienia do C ++. Zajmie to sporo pracy. Musielibyśmy uważać, aby nie być zbyt pedantycznym / zbyt technicznym; oczywiste jest, że cplusplus.com zatrudnia co najmniej kilku redaktorów technicznych, którzy trzymają pedały na dystans. Musielibyśmy dobrze zorganizować informacje; FAQ tutaj nie są dobrze zorganizowane. Musielibyśmy również bardzo uważać, aby nie wyrzucać zbyt wiele bezpośrednio ze standardu; to nielegalne.
źródło
<thread>
lub czegoś<atomic>
takiego i po prostu dostałem „proszę napisz tę stronę”, więc się poddałem. Pozwól, że sprawdzę jeszcze raz! Och, obsługa C ++ 0x byłaby oczywiście ogromną zaletą!http://www.cplusplus.com/reference/clibrary/cstring/strncpy/
Nie wspomina, że „Jeśli kopiowanie odbywa się między nakładającymi się obiektami, zachowanie jest niezdefiniowane”. (4.11.2.4 w standardzie C89. Nie mam kopii C90, do czego tak naprawdę odnosi się C ++ 03, ale powinny się one różnić tylko takimi elementami, jak numeracja stron.)
źródło
destination and source shall not overlap
.Dokumentacja podana przez cplusplus.com jest często niepoprawna lub niekompletna.
Takim przykładem jest
atoi
dokumentacja na cplusplus.com.atoi
W sekcji Return nie ma wzmianki o wartości zwracanej 0, jeśli nie można wykonać konwersji podczas używania funkcji.
cplusplus.com Zwrot w sekcji brzmi „... Jeśli przekonwertowana wartość byłaby poza zakresem reprezentowalnych wartości przez int, powoduje to niezdefiniowane zachowanie”.
Jest to poprawne, zgodnie ze standardowym „ Jeśli wartości liczbowej ciągu nie można przedstawić w int, zachowanie jest niezdefiniowane ”.
Jednak sekcja nie jest pełna, ponieważ nie podaje 0 jako wartości zwracanej, co może wprowadzać w błąd. Wyrażenie „... konwersja nie jest wykonywana, a zwracane jest zero”. jest spełniony wcześniej w akapicie opisu, ale konieczne jest, aby mieć go w sekcji Zwrot .
Wiele przykładowych kodów źródłowych podanych na stronie cplusplus.com jest niepoprawnych.
Wielu początkujących, którzy szukają tych referencji, popełniają poważne błędy.
Aby zacytować przykład:
EDYCJA: Przywołany wcześniej przykład był niepoprawny.
źródło
Dokumentacja dotycząca
type_info
prób wyjaśnieniatypeid
najpierw, ale kończy się niepowodzeniem:Teraz drugi akapit już się nie zgadza z pierwszym. W
typeid(*ptr)
,typeid
jest stosowane do ekspresji. Jest to dość istotne, ponieważ pojęciestatic
idynamic
typy mają sens tylko w kontekście ekspresji, a nie przedmiotów. Pomija także przypadki takie jaktypeid(foo())
.Ponadto akapit drugi pomija odniesienia. One także mogą mieć typy statyczne różne od typu dynamicznego obiektu, do którego się odnoszą.
źródło
Dokumentacja
std::pair<T1,T2>::operator==
mówi, że oba elementy są testowane pod kątem równości. Dokumentacjastd::pair<T1,T2>::operator<
mówi, że drugie elementy są brane pod uwagę tylko wtedy, gdy pierwsze elementy są równe.Słowo „równy” pojawia się w obu przypadkach. Jednak tylko w pierwszym przypadku to naprawdę oznacza
T::operator==
. W drugim przypadku równe środki!(a.first<b.first || b.first<a.first)
źródło
operator==
w drugim przypadku, jeśli operator jest dostępny?operator==
ioperator<
.