Что случилось с cplusplus.com?

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

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

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

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


Обновление: было много замечательных ответов, и я серьезно изменил свой взгляд на cplusplus.com. Здесь я бы хотел привести несколько результатов. не стесняйтесь предлагать больше (и продолжайте отправлять ответы).

По состоянию на 29 июня 2011 года:

  • Некорректное описание некоторых алгоритмов (например, remove ).
  • Информация о поведении функций иногда неверна ( atoi ), не упоминается о специальных случаях ( strncpy ) или опускается важная информация (антагонизация iteratorа).
  • Примеры содержат устаревший код (стиль #include).
  • Неточная терминология оказывает плохую услугу учащимся и общему сообществу («STL», «компилятор» и «toolchain»).
  • Неверное и вводящее в заблуждение описание typeid слова typeid .

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

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

Рассмотрим std::remove из .

Дело в том, что std::remove не удаляет элемент из контейнера. Его потому, что std::remove работает только с парой iteratorов и ничего не знает о контейнере, который фактически содержит элементы. Фактически, std::remove может знать базовый контейнер, потому что он не может перейти от пары iteratorов, чтобы узнать о контейнере, к которому принадлежат iteratorы. Таким образом, 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, существует с аналогичным поведением, но работает между двумя iteratorами.

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

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

  • Удаление STL не работает должным образом?

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

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

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

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

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

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

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

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

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

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

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

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

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

Приведем пример:

EDIT: Пример, приведенный выше, был неправильным.

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

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

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

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

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

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

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

  • gcc: printf и long double приводит к неправильному выходу.
  • Как рассчитать средние значения цвета rgb растрового изображения
  • LINQ Orderby Descending Query
  • Может ли SFINAE обнаруживать нарушения частного доступа?
  • Что означает «var» в C #?
  • Как динамически создавать class в C #?
  • unsigned int и подписанное сравнение символов
  • Ядро ASP.NET: исключение или включение файлов в публикацию
  • MS Dynamics CRM online 2011 - Проблемы с аутентификацией
  • Как преобразовать NSString в NSNumber
  • Как найти метод, называемый текущим методом?
  • Давайте будем гением компьютера.