Что не так с cplusplus.com?


201

Возможно, это не совсем подходящий форум для этого вопроса, но позвольте мне дать ему шанс, рискуя быть отодвинутым.

Существует несколько ссылок на стандартную библиотеку C ++, включая бесценный стандарт ISO, MSDN , IBM , cppreference и cplusplus . Лично при написании C ++ мне нужна ссылка, которая имеет быстрый произвольный доступ, короткое время загрузки и примеры использования, и я считаю cplusplus.com довольно полезным. Тем не менее, я часто слышал негативные мнения об этом сайте здесь, на SO, поэтому я хотел бы уточнить:

Каковы ошибки, неправильные представления или плохие советы, данные cplusplus.com? Каковы риски использования его для принятия решений по кодированию?

Позвольте мне добавить этот момент: я хочу иметь возможность отвечать на вопросы здесь, в SO, с точными цитатами стандарта, и, таким образом, я хотел бы публиковать ссылки для немедленного использования, и cplusplus.com был бы моим выбором сайта, если бы не Эта проблема.


62
Почему отрицательные? Это совершенно правильный вопрос. Если вам нужна ссылка, вам нужен надежный источник. Я также слышал жалобы на cplusplus.com, где я могу получить краткий справочник по стандартной библиотеке, и поэтому это интересно.
Xeo

48
@ Олафур: Я не хочу мнения, я хочу конкретные списки ошибок на этом сайте. Если их нет, я хочу использовать этот вопрос, чтобы рассеять критику в будущем.
Керрек С.Б.

4
@ Олафур Вейдж: возможно. Но можно сделать совершенно объективные выводы о точности / правдивости содержания этого веб-сайта.
Даниэль Слооф

14
Мы уже на первой странице "cplusplus.com" в Google. Впечатляет, как быстро ТАК вопросы поднимаются в поисковом рейтинге.
Гонки легкости на орбите

5
Я думаю, что это справедливо - учитывая, как высоко этот вопрос занимает место при поиске «cplusplus» - отметить, что, поскольку этот вопрос был задан, в cplusplus.com был внесен ряд исправлений. На самом деле, первые три ответа, которые указывают на ошибки, больше не соответствуют действительности.
Марк Х

Ответы:


72

Изменить: документация для std::removeбыла исправлена ​​с момента написания этого ответа. То же самое относится и к list::remove.

Позвольте привести вам пример того, как cpluscplus.com может ошибиться.

Рассмотрим std::removeфункцию от <algorithm>.

Дело в том, что std::removeне удаляет элемент из контейнера. Это потому, что std::removeработает только с парой итераторов и ничего не знает о контейнере, который фактически содержит элементы. На самом деле, невозможно std::removeузнать базовый контейнер, потому что он не может пройти путь от пары итераторов, чтобы узнать о контейнере, к которому принадлежат итераторы. Так std::removeчто на самом деле не удаляет предметы, просто потому что не может . Единственный способ действительно удалить элемент из контейнера - это вызвать функцию-член этого контейнера.

Так что, если вы хотите удалить элементы, тогда используйте Erase-Remove Idiom :

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

Но cplusplus.comдает неверную информацию о std::remove. Это говорит

Обратите внимание, что эта функция не изменяет элементы после нового конца, которые сохраняют свои старые значения и по- прежнему доступны .

что не правильно. Итератор в диапазоне [new_end, old_end)все еще разыменовывается, но это НЕ означает, что они сохраняют старые значения и по-прежнему доступны. Они не указаны.


Точно так же cplusplus.comдает неверную информацию о себе list::remove. Это говорит ,

Обратите внимание, что глобальная функция алгоритма, remove, существует с похожим поведением, но работает между двумя итераторами.

что совершенно неправильно. Глобальное удаление, а именно std::remove, не похоже на то list::remove, как мы видели, что первое НЕ действительно удаляет элементы из контейнера, потому что это не может , тогда как второе (функция-член) действительно удаляет элементы, потому что оно может .

Этот ответ скопирован из моего другого ответа в следующей теме, с небольшими изменениями:

Примечание: так как я столкнулся с этим недавно, когда отвечал в вышеупомянутой теме, я помню это. За последние два года я столкнулся с множеством ошибок, которые не помню. Я мог бы добавить еще несколько позже, если я столкнусь снова.


1
+1: много ли таких неправильных утверждений на этом сайте?
Klaim

4
@ Александр: list::removeдействительно удаляет элементы из контейнера. Но std::removeНЕ удаляет элементы из контейнера. Я не могу сказать, что их поведение "похоже".
Наваз

3
Хорошо поймал! Это очень хороший пример того, что я ищу.
Керрек С.Б.

3
«Подобное» является спорным, поскольку вопрос заключается в том, похожи ли две разные операции или нет. Он также спорен ли cplusplus.com следует предлагать мнение , замаскированные документации. Но в любом случае, «сохранить свои старые значения» - непростительная ошибка, это просто показывает, что описание cplusplus не было основано на стандарте.
Стив Джессоп

5
@ Стив: Вы сказали "Similar" is debateable. Если слово similarявляется дискуссионным, то это очень говорит о том, что это слово не является правильным словом, и его следует избегать при объяснении поведения std::removeи list::remove, поскольку объяснение должно быть максимально четким, оно не должно требовать другого объяснения.
Наваз

38

Я собираюсь предложить мнение немного наоборот. На cplusplus.com много полезной информации. Выбери его до смерти, и да, конечно, у него есть свои проблемы, но какого сайта нет? Конечно, не этот сайт . Люди, которые живут в стеклянных домах, не должны бросать камни. Здесь тоже много дезинформации. Есть принятые ответы, которые категорически неверны, отрицательные ответы (некоторые отрицательные!) Точны.

Одна из проблем cplusplus.com заключается в том, что это закрытый сайт; То же самое касается большинства других упомянутых ссылочных сайтов. Это идет вразрез с разработанным сообществом сайтом, таким как Stack Overflow. Получение возможности вносить достоверные изменения не займет много времени, и даже самые новые новички могут легко внести предложения по улучшению. Сравните это с cplusplus.com. Вы вечный новичок, если вы не в их штате. Даже если вы являетесь ключевым участником WG21, вам придется пройти через механизм отчетов по электронной почте, если вы видите ошибку где-то на этом сайте. Анафема!

Для нас на этом сайте было бы решение разработать собственную ссылку на C ++. Это займет совсем немного работы. Мы должны быть осторожны, чтобы не быть слишком педантичными / слишком техническими; Очевидно, что в cplusplus.com работают как минимум несколько технических редакторов, которые держат педантов в страхе. Мы должны держать информацию хорошо организованной; часто задаваемые вопросы здесь не очень хорошо организованы. Мы также должны были бы быть очень осторожными, чтобы не выдавать слишком много прямо из стандарта; это незаконно


7
Раньше я часто посещал старый cppreference.com, но теперь они переработали его в нечто вроде вики (доступно ли это для редактирования всем?) ... и мне это больше не нравится. Трудно увидеть важную информацию, я нахожу. Ему просто не хватает немедленного удовлетворения от cplusplus.com. Думаю.
Керрек С.Б.

14
Вау! Я вижу прямо противоположное. Я перестал посещать старый cppreference.com, потому что мне было трудно пройти и плохо написано. Новый cppreference.com, по-видимому, представляет собой сайт без рекламы, созданный сообществом, который делает именно то, что я предложил в моем последнем абзаце.
Дэвид Хаммен

1
Может быть, это был только я, я попробую еще раз. Я думаю, что хотел посмотреть что-то <thread>или что- <atomic>то и просто получил «пожалуйста, напишите эту страницу», поэтому я сдался. Позвольте мне проверить еще раз! О, поддержка C ++ 0x, конечно, будет огромным бонусом!
Керрек С.Б.

10
«Люди, которые живут в стеклянных домах, не должны бросать камни». SO не претендует (частично) на библиотечную ссылку для C ++, как это делает cplusplus.com/reference . Когда люди предъявляют претензии здесь, они ссылаются на стандарт, чтобы поддержать их, или, если они этого не делают, тогда кто-то другой приходит и заполняет. Если они ошибаются, вы можете увидеть их работу. Если cplusplus.com не прав, вы просто написали код, который не будет работать в какой-либо реализации C ++, отличной от той, которую автор использовал для «подробного описания его элементов». Проблема в том, что cplusplus.com неформален, но написан так, чтобы выглядеть формально.
Стив Джессоп

4
ТАК неформально, и написано, чтобы выглядеть неформально. Теперь, если cplusplus.com не предназначен для точной документации / справочного материала, и я где-то пропустил заявление об отказе от ответственности, то достаточно справедливо, предположим, что любые камни будут брошены на людей, которые используют его таким образом, а не на сам сайт. Но дело в том, что то, что cplusplus.com говорит что-то о функции C ++, не означает, что это правда, и это стоит знать, если вы планируете использовать ее в качестве краткого справочника. Я использую его для поиска сигнатур функций, но никогда не улаживаю тонкую точку, соответствует ли мой код или нет.
Стив Джессоп

14

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

Не упоминается, что «если копирование происходит между перекрывающимися объектами, поведение не определено». (4.11.2.4 в стандарте C89. У меня нет под рукой копии C90, на которую на самом деле ссылается C ++ 03, но предполагается, что они отличаются только такими вещами, как нумерация страниц.)


Ах, старая библиотека С ... хорошо.
Керрек С.Б.

6
Они упоминают destination and source shall not overlap.
Снайпер

2
@Sniper "не должен перекрываться" не то же самое, что "поведение не определено". Ваш комментарий на самом деле освещает один из тонких, распространенных недостатков cplusplus.com - это звучит правильно, но это не правильно.
Эндрю Хенле

@ Снайпер: Я думаю, что, вероятно, он не сказал, что, когда я сделал этот ответ в 2011 году. Я бы принял «не будет перекрывать» как достаточное ограничение на входы.
Стив Джессоп

9

Документация, предоставленная cplusplus.com, часто является неправильной или неполной.

Раз такой пример, atoiдокументация на cplusplus.com.

atoi
В разделе Return нет упоминания о возвращаемом значении 0, если при использовании функции невозможно выполнить преобразование.

В разделе возврата cplusplus.com говорится: «... Если преобразованное значение будет выходить за пределы диапазона представимых значений с помощью int, это приведет к неопределенному поведению».

Это правильно, согласно стандарту « Если числовое значение строки не может быть представлено в int, то поведение не определено ».

Однако этот раздел не является полным, поскольку в нем не указывается 0 в качестве возвращаемого значения, что может вводить в заблуждение. Фраза «... преобразование не выполняется и возвращается ноль». встречается ранее в параграфе описания, но важно иметь его в разделе возврата .

Многие примеры исходных кодов, приведенные на cplusplus.com, неверны.
Многие новички, ищущие эти ссылки, ведут к ошибкам в балансе.

Чтобы привести пример:

РЕДАКТИРОВАТЬ: пример, который я привел ранее, был неверным.


5
Возможно, баллант -> вопиющий? Однако «баллант» - это французское слово «висячий», что может быть связано с ошибками, связанными с указателями.
hardthth

Перечитайте этот пример итератора ... нет неопределенного поведения.
Деннис Зикефуз

1
Вы заявили: «Многие примеры исходных кодов, приведенные на cplusplus.com, неверны». а затем удалил пример со словами «Пример, который я привел ранее, был неверным». - Почему вы удалили пример, тогда? :)
user2962533

Согласно этому сайту, описанный вами случай приводит к неопределенному типу возвращаемого значения, а не неопределенному поведению. en.cppreference.com/w/cpp/string/byte/atoi ; однако, похоже, что Cplusplus.com обновил свою документацию, чтобы соответствовать тому, что вы говорите. Очевидно, они отвечают на запросы сообщества о внесении исправлений. Тем не менее, я не уверен, какой веб-сайт является наиболее правильным, потому что эти два вопроса говорят о совершенно разных вещах.
shawn1874

Прошло 9 лет с тех пор, как этот ответ был опубликован. По-прежнему ли принято считать, что Cplusplus.com содержит значительное количество неверной или неполной информации?
Тайлер Шеллберг

3

Документация для type_infoпытается typeidсначала объяснить , но не получается:

typeid может применяться непосредственно к типам, и в этом случае он возвращает свою информацию; Или объектам, в этом случае он возвращает информацию о типе объекта.

Когда typeid применяется к разыменованному указателю на объект типа полиморфного класса (класс, объявляющий или наследующий виртуальную функцию), он учитывает его динамический тип (т. Е. Тип самого производного объекта).

Теперь второй абзац уже не согласен с первым. В typeid(*ptr), typeidприменяется к выражению. Это довольно важно, поскольку понятие staticи dynamicтипы имеет смысл только в контексте выражения, а не объектов. Это также пропускает такие случаи, как typeid(foo()).

Кроме того, во втором абзаце отсутствуют ссылки. Они также могут иметь статические типы, отличные от динамического типа объекта, на который они ссылаются.


Очень хорошо - вопросы RTTI возникают на SO с предсказуемой регулярностью. Полезно знать, на что не ссылаться.
Керрек С.Б.

3

Документация std::pair<T1,T2>::operator==говорит, что оба элемента проверены на равенство. В документации std::pair<T1,T2>::operator<сказано, что вторые элементы считаются только в том случае, если первые элементы равны.

Слово «равно» появляется в обоих случаях. Но только в первом случае это действительно значит T::operator==. Во втором случае равные средства!(a.first<b.first || b.first<a.first)


Это обязательно, или библиотека может свободно использоваться operator==во втором случае, если оператор доступен?
Kerrek SB

1
Обязательное. Стандарт C ++ не смешивается operator==и operator<.
MSalters
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.