对于这个问题,这可能不是一个非常合适的论坛,但是让我试一试,冒着被搬走的风险。
C ++标准库有几个参考,包括宝贵的ISO标准,MSDN,IBM,cppreference和cplusplus。就个人而言,在编写C ++时,我需要一个具有快速随机访问,短加载时间和使用示例的引用,并且我一直在发现cplusplus.com非常有用。但是,我一直在SO上听到关于该网站的负面看法,所以我想具体说明:
cplusplus.com提供的错误,误解或错误建议有哪些?使用它做出编码决定有哪些风险?
让我补充一点:我希望能够通过准确的标准报价在这里回答问题,因此我想发布可立即使用的链接,而cplusplus.com将是我选择的网站不是这个问题。
答案 0 :(得分:70)
修改:自编写此答案以来,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
的错误的信息。 It says
请注意,此功能不会改变超过新结尾的元素,保持旧值并仍可访问。
这是不正确的。范围 [new_end, old_end)
中的迭代器仍然是可解除引用的,但这并不意味着它们保留旧值并且仍可访问。它们未指定。
同样,cplusplus.com
也会提供有关list::remove
的错误的信息。 It says,
请注意,全局算法函数remove,存在,具有类似的行为,但在两个迭代器之间运行。
这是完全错误的。全局删除std::remove
与list::remove
不相似,因为我们看到前并未真正从容器中移除项目,因为它无法,而后者(成员函数)确实删除项,因为它可以。
这个答案是从我在下一个主题中的另一个答案中复制而来的,几乎没有修改:
注意:由于我最近在回复上述主题时遇到过这个问题,我记得它。我在过去两年中遇到过很多错误,我不记得了。如果我再次遇到,我可能会在以后添加更多。
答案 1 :(得分:32)
我会稍微提出相反的意见。 cplusplus.com上有很多很好的信息。选择它去死,是的,当然它有它的问题,但是什么网站没有?当然不是这个网站。住在玻璃房子里的人不应该扔石头。这里也有很多错误的信息。已经接受的答案是完全错误的,贬低的答案(有些是否定的!)是正确的。
cplusplus.com的一个问题是它是一个封闭的网站;大多数提到的其他参考站点也是如此。这违背了社交开发的网站,如Stack Overflow。获得进行可信编辑的能力并不需要那么长时间,即使是最新的新手也可以轻松地提出改进建议。与cplusplus.com相比。如果你不在他们的工作人员,你是一个永久的新手。即使您是WG21的关键成员,如果您在该网站的某个地方看到错误,也必须通过他们的电子邮件报告机制。诅咒!
我们将在此站点为您提供解决方案来开发我们自己的C ++参考。这需要相当多的工作。我们必须小心,不要太迂腐/太技术;很明显,cplusplus.com雇佣了至少一些技术编辑来保持这些学员。我们必须保持信息井井有条;这里的FAQ没有很好的组织。我们还必须非常小心,不要直接从标准上喷出太多东西;这是非法的。
答案 2 :(得分:14)
http://www.cplusplus.com/reference/clibrary/cstring/strncpy/
未提及“如果在重叠的对象之间进行复制,则行为未定义。” (C89标准中的4.11.2.4。我没有C90的副本,这是C ++ 03实际引用的内容,但它们应该只在页码编号等方面有所区别。)
答案 3 :(得分:8)
cplusplus.com提供的文档通常不正确或不完整。
这样的例子就是cplusplus.com上的atoi
文档。
atoi
在返回部分,如果在使用该功能时无法执行转换,则不会提及0返回值。
cplusplus.com 返回部分状态“...如果转换后的值超出了int的可表示值范围,则会导致未定义的行为。”
这是正确的,根据标准“如果字符串的数值不能用int表示,那么行为是未定义的”。
然而该部分并未满,因为它没有提及0作为返回值,这可能会产生误导。短语“......没有执行转换,返回零。”在描述段落之前已经满足,但必须在返回部分中使用它。
cplusplus.com上提供的许多示例源代码都不正确。
许多关注这些参考文献的新手都会导致出现堕落错误。
举一个例子:
编辑:我之前引用的例子不正确。答案 4 :(得分:3)
type_info
的文档首先尝试解释typeid
,但失败了:
typeid可以直接应用于 类型,在这种情况下它返回它 信息;或者对象,其中 它返回的信息 对象的类型。
当typeid应用于a时 取消引用一个对象的指针 多态类类型(类 声明或继承虚拟 功能),它考虑其动态 类型(即最多的类型) 派生对象)。
现在第二段已经不同意第一段了。在typeid(*ptr)
中,typeid
应用于表达式。这是非常重要的,因为static
和dynamic
类型的概念仅在表达的上下文中有意义,而不是对象。它也错过了像typeid(foo())
这样的案例。
此外,第二段省略了引用。它们也可以具有与它们引用的对象的动态类型不同的静态类型。
答案 5 :(得分:3)
std::pair<T1,T2>::operator==
的文档说两个元素都经过了相等的测试。 std::pair<T1,T2>::operator<
的文档说,仅当第一个元素相等时才考虑第二个元素。
两种情况都会出现“相等”一词。然而,只有在第一种情况下才真正意味着T::operator==
。在第二种情况下,等于!(a.first<b.first || b.first<a.first)