Возможно, это не совсем подходящий форум для этого вопроса, но позвольте мне дать ему шанс, рискуя быть отодвинутым.
Существует несколько ссылок на стандартную библиотеку C ++, включая бесценный стандарт ISO, MSDN , IBM , cppreference и cplusplus . Лично при написании C ++ мне нужна ссылка, которая имеет быстрый произвольный доступ, короткое время загрузки и примеры использования, и я считаю cplusplus.com довольно полезным. Тем не менее, я часто слышал негативные мнения об этом сайте здесь, на SO, поэтому я хотел бы уточнить:
Каковы ошибки, неправильные представления или плохие советы, данные cplusplus.com? Каковы риски использования его для принятия решений по кодированию?
Позвольте мне добавить этот момент: я хочу иметь возможность отвечать на вопросы здесь, в SO, с точными цитатами стандарта, и, таким образом, я хотел бы публиковать ссылки для немедленного использования, и cplusplus.com был бы моим выбором сайта, если бы не Эта проблема.
Ответы:
Изменить: документация для
std::remove
была исправлена с момента написания этого ответа. То же самое относится и кlist::remove
.Позвольте привести вам пример того, как cpluscplus.com может ошибиться.
Рассмотрим
std::remove
функцию от<algorithm>
.Дело в том, что
std::remove
не удаляет элемент из контейнера. Это потому, чтоstd::remove
работает только с парой итераторов и ничего не знает о контейнере, который фактически содержит элементы. На самом деле, невозможноstd::remove
узнать базовый контейнер, потому что он не может пройти путь от пары итераторов, чтобы узнать о контейнере, к которому принадлежат итераторы. Такstd::remove
что на самом деле не удаляет предметы, просто потому что не может . Единственный способ действительно удалить элемент из контейнера - это вызвать функцию-член этого контейнера.Так что, если вы хотите удалить элементы, тогда используйте Erase-Remove Idiom :
Но
cplusplus.com
дает неверную информацию оstd::remove
. Это говоритчто не правильно. Итератор в диапазоне
[new_end, old_end)
все еще разыменовывается, но это НЕ означает, что они сохраняют старые значения и по-прежнему доступны. Они не указаны.Точно так же
cplusplus.com
дает неверную информацию о себеlist::remove
. Это говорит ,что совершенно неправильно. Глобальное удаление, а именно
std::remove
, не похоже на тоlist::remove
, как мы видели, что первое НЕ действительно удаляет элементы из контейнера, потому что это не может , тогда как второе (функция-член) действительно удаляет элементы, потому что оно может .Этот ответ скопирован из моего другого ответа в следующей теме, с небольшими изменениями:
Примечание: так как я столкнулся с этим недавно, когда отвечал в вышеупомянутой теме, я помню это. За последние два года я столкнулся с множеством ошибок, которые не помню. Я мог бы добавить еще несколько позже, если я столкнусь снова.
источник
list::remove
действительно удаляет элементы из контейнера. Ноstd::remove
НЕ удаляет элементы из контейнера. Я не могу сказать, что их поведение "похоже"."Similar" is debateable
. Если словоsimilar
является дискуссионным, то это очень говорит о том, что это слово не является правильным словом, и его следует избегать при объяснении поведенияstd::remove
иlist::remove
, поскольку объяснение должно быть максимально четким, оно не должно требовать другого объяснения.Я собираюсь предложить мнение немного наоборот. На cplusplus.com много полезной информации. Выбери его до смерти, и да, конечно, у него есть свои проблемы, но какого сайта нет? Конечно, не этот сайт . Люди, которые живут в стеклянных домах, не должны бросать камни. Здесь тоже много дезинформации. Есть принятые ответы, которые категорически неверны, отрицательные ответы (некоторые отрицательные!) Точны.
Одна из проблем cplusplus.com заключается в том, что это закрытый сайт; То же самое касается большинства других упомянутых ссылочных сайтов. Это идет вразрез с разработанным сообществом сайтом, таким как Stack Overflow. Получение возможности вносить достоверные изменения не займет много времени, и даже самые новые новички могут легко внести предложения по улучшению. Сравните это с cplusplus.com. Вы вечный новичок, если вы не в их штате. Даже если вы являетесь ключевым участником WG21, вам придется пройти через механизм отчетов по электронной почте, если вы видите ошибку где-то на этом сайте. Анафема!
Для нас на этом сайте было бы решение разработать собственную ссылку на C ++. Это займет совсем немного работы. Мы должны быть осторожны, чтобы не быть слишком педантичными / слишком техническими; Очевидно, что в cplusplus.com работают как минимум несколько технических редакторов, которые держат педантов в страхе. Мы должны держать информацию хорошо организованной; часто задаваемые вопросы здесь не очень хорошо организованы. Мы также должны были бы быть очень осторожными, чтобы не выдавать слишком много прямо из стандарта; это незаконно
источник
<thread>
или что-<atomic>
то и просто получил «пожалуйста, напишите эту страницу», поэтому я сдался. Позвольте мне проверить еще раз! О, поддержка C ++ 0x, конечно, будет огромным бонусом!http://www.cplusplus.com/reference/clibrary/cstring/strncpy/
Не упоминается, что «если копирование происходит между перекрывающимися объектами, поведение не определено». (4.11.2.4 в стандарте C89. У меня нет под рукой копии C90, на которую на самом деле ссылается C ++ 03, но предполагается, что они отличаются только такими вещами, как нумерация страниц.)
источник
destination and source shall not overlap
.Документация, предоставленная cplusplus.com, часто является неправильной или неполной.
Раз такой пример,
atoi
документация на cplusplus.com.atoi
В разделе Return нет упоминания о возвращаемом значении 0, если при использовании функции невозможно выполнить преобразование.
В разделе возврата cplusplus.com говорится: «... Если преобразованное значение будет выходить за пределы диапазона представимых значений с помощью int, это приведет к неопределенному поведению».
Это правильно, согласно стандарту « Если числовое значение строки не может быть представлено в int, то поведение не определено ».
Однако этот раздел не является полным, поскольку в нем не указывается 0 в качестве возвращаемого значения, что может вводить в заблуждение. Фраза «... преобразование не выполняется и возвращается ноль». встречается ранее в параграфе описания, но важно иметь его в разделе возврата .
Многие примеры исходных кодов, приведенные на cplusplus.com, неверны.
Многие новички, ищущие эти ссылки, ведут к ошибкам в балансе.
Чтобы привести пример:
РЕДАКТИРОВАТЬ: пример, который я привел ранее, был неверным.
источник
Документация для
type_info
пытаетсяtypeid
сначала объяснить , но не получается:Теперь второй абзац уже не согласен с первым. В
typeid(*ptr)
,typeid
применяется к выражению. Это довольно важно, поскольку понятиеstatic
иdynamic
типы имеет смысл только в контексте выражения, а не объектов. Это также пропускает такие случаи, какtypeid(foo())
.Кроме того, во втором абзаце отсутствуют ссылки. Они также могут иметь статические типы, отличные от динамического типа объекта, на который они ссылаются.
источник
Документация
std::pair<T1,T2>::operator==
говорит, что оба элемента проверены на равенство. В документацииstd::pair<T1,T2>::operator<
сказано, что вторые элементы считаются только в том случае, если первые элементы равны.Слово «равно» появляется в обоих случаях. Но только в первом случае это действительно значит
T::operator==
. Во втором случае равные средства!(a.first<b.first || b.first<a.first)
источник
operator==
во втором случае, если оператор доступен?operator==
иoperator<
.