cplusplus.com有什么问题?

时间:2011-06-29 11:40:40

标签: c++

对于这个问题,这可能不是一个非常合适的论坛,但是让我试一试,冒着被搬走的风险。

C ++标准库有几个参考,包括宝贵的ISO标准,MSDNIBMcppreferencecplusplus。就个人而言,在编写C ++时,我需要一个具有快速随机访问,短加载时间和使用示例的引用,并且我一直在发现cplusplus.com非常有用。但是,我一直在SO上听到关于该网站的负面看法,所以我想具体说明:

cplusplus.com提供的错误,误解或错误建议有哪些?使用它做出编码决定有哪些风险?

让我补充一点:我希望能够通过准确的标准报价在这里回答问题,因此我想发布可立即使用的链接,而cplusplus.com将是我选择的网站不是这个问题。

6 个答案:

答案 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::removelist::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应用于表达式。这是非常重要的,因为staticdynamic类型的概念仅在表达的上下文中有意义,而不是对象。它也错过了像typeid(foo())这样的案例。

此外,第二段省略了引用。它们也可以具有与它们引用的对象的动态类型不同的静态类型。

答案 5 :(得分:3)

std::pair<T1,T2>::operator==的文档说两个元素都经过了相等的测试。 std::pair<T1,T2>::operator<的文档说,仅当第一个元素相等时才考虑第二个元素。

两种情况都会出现“相等”一词。然而,只有在第一种情况下才真正意味着T::operator==。在第二种情况下,等于!(a.first<b.first || b.first<a.first)