cplusplus.com怎么了?


200

对于这个问题,这也许不是一个非常合适的论坛,但让我试一下,否则有可能被移走。

C ++标准库有多个参考,包括宝贵的ISO标准,MSDNIBMcppreferencecplusplus。就个人而言,在编写C ++时,我需要一个具有快速随机访问,较短的加载时间和用法示例的参考,并且我发现cplusplus.com非常有用。但是,在SO上,我经常听到对该网站的负面评价,因此我想具体一点:

cplusplus.com的错误,误解或不良建议是什么?使用它做出编码决策有什么风险?

让我补充一点:我希望能够在SO上用标准的准确报价来回答问题,因此我想发布立即可用的链接,如果不是这样,cplusplus.com将是我的选择站点这个问题。


62
为什么要下票?这是一个完全正确的问题。如果需要参考,则需要可信赖的来源。我还听到了对cplusplus.com的投诉,在这里我可以快速获得标准库的参考,因此,这很有趣。
Xeo

48
@Olafur:我不想发表意见,我想要该站点上的错误的具体清单。如果没有,我希望能够使用这个问题来消除将来的批评。
Kerrek SB 2011年

4
@ÓlafurWaage:也许吧。但是,关于该网站内容的准确性/真实性,可以提出客观的观点。
Daniel Sloof 2011年

14
我们已经在Google的“ cplusplus.com”的第一页上了。令人印象深刻的是,SO问题快速提升了搜索排名。
Lightness Races in Orbit,

5
考虑到此问题在搜索“ cplusplus”中的排名有多高,我认为这是很公平的。要注意,自从提出此问题以来,对cplusplus.com进行了许多更正。实际上,指出错误的前三个答案不再正确。
Mark H

Answers:


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:这个网站上还有更多不正确的陈述吗?
克拉姆2011年

4
@Alexander:list::remove确实从容器中删除了元素。但是std::remove不要从容器中删除元素。我不能说他们的行为是“相似的”。
Nawaz

3
好赶上!这是我正在寻找的东西的一个很好的例子。
Kerrek SB 2011年

3
“相似”是有争议的,因为两个不同的操作是否相似是一个问题。cplusplus.com是否应提供伪装成文档的意见还存在争议。但是无论如何,“保留其旧值”是一个无法原谅的错误,它只是表明cplusplus描述不是基于该标准。
史蒂夫·杰索普

5
@Steve:你说过"Similar" is debateable。如果字similar是值得商榷的,那么它很讲述这个词是不是正确的单词和解释的行为时,应避免std::removelist::remove,因为解释应该明确尽可能,它不应该需要另一种解释。
Nawaz

38

我将提出相反的意见。在cplusplus.com上有很多很好的信息。选择它要死,是的,它当然有问题,但是哪个站点没有?当然不是这个网站。住在玻璃房子里的人不应该扔石头。这里也有很多错误信息。有些公认的答案完全是错误的,但投票否定的答案(有些否定!)是正确的。

cplusplus.com的一个问题是它是一个封闭的站点。提到的大多数其他参考站点也是如此。这与诸如Stack Overflow之类的社区开发站点背道而驰。获得可靠编辑的能力并不需要花很长时间,即使是最新的新手也可以轻松地提出改进建议。将其与cplusplus.com进行比较。如果您不在他们的职员中,那么您就是永久的新手。即使您是WG21的重要成员,如果您发现该站点中的某个错误,也必须通过他们的电子邮件报告机制。恶心!

解决方案是在此站点为我们开发自己的C ++参考。这将需要大量的工作。我们必须注意不要太学究/太技术化;显而易见,cplusplus.com至少雇用了几名技术编辑,他们将这些学徒拒之门外。我们必须保持信息的井井有条;此处的常见问题解答组织得不好。我们还必须非常小心,不要直接从标准中喷出太多。那是非法的。


7
我曾经经常光顾旧的cppreference.com,但现在他们已经将其重新制作成Wiki形式的东西(每个人都可以编辑吗?)……我真的不喜欢它。我发现很难看到重要信息。它只是缺少我从cplusplus.com获得的直接满足。我认为。
Kerrek SB 2011年

14
哇!我看到的恰恰相反。我停止浏览旧的cppreference.com,因为我发现它很难遍历并且编写得不好。新的cppreference.com似乎是一个无广告的基于社区的网站,完全按照我在上一段中的建议进行操作。
David Hammen

1
也许只是我,我会再尝试一次。我想,我想看看一些<thread><atomic>东西,刚刚拿到“请填写此页”,所以我放弃了。让我再检查一次!哦,对C ++ 0x的支持当然是巨大的好处!
Kerrek SB 2011年

10
“住在玻璃房里的人不应该扔石头。” 因此,SO并不像cplusplus.com/reference那样声称(部分)是C ++的库参考。当人们在这里提出索赔时,他们会引用标准来支持它们,或者如果没有,那么会有其他人来填写。如果他们错了,您可以看到他们的工作。如果cplusplus.com错误,则您编写的代码将在某些C ++实现上失败,而不是作者用来生成“其元素的详细说明”的代码。问题在于cplusplus.com是非正式的,但编写时看起来很正式。
史蒂夫·杰索普

4
SO是非正式的,并且看起来是非正式的。现在,如果cplusplus.com并非旨在成为准确的文档/参考资料,而我在某个地方错过了免责声明,那么就足够公平了,请假设将任何石头扔给以这种方式使用它的人,而不是网站本身。但是重点是,仅仅因为cplusplus.com讲了有关C ++函数的内容并不意味着它是真的,所以值得一提的是,如果您打算将其用作快速参考。我使用它来查找函数签名,但是无论我的代码是否符合要求,都决不会解决任何问题。
史蒂夫·杰索普

14

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

不能提及“如果在重叠的对象之间进行复制,则行为是不确定的。” (在C89标准中为4.11.2.4。我没有C90的副本,这实际上是C ++ 03所指的,但它们应该仅在页码等方面有所不同。)


啊,旧的C库...很好。
Kerrek SB 2011年

6
他们提到 destination and source shall not overlap
狙击手

2
@Sniper“不应重叠”是一样的“这种行为是未定义”。您的评论实际上说明了cplusplus.com的一个细微,普遍存在的缺陷-听起来不错,但这是不正确的。
Andrew Henle

@Sniper:我想大概没有说过,当我在2011年做出这个回答时。我会以“不得重叠”作为对输入的充分限制。
史蒂夫·杰索普

9

cplusplus.com提供的文档通常不正确或不完整。

一旦atoi有了这样的示例,cplusplus.com上的文档。

atoi
在“返回”部分中,如果使用该函数不能执行任何转换,则没有提及返回值0。

cplusplus.com 返回部分指出“ ...如果转换后的值超出int可表示的值范围,则将导致未定义的行为。”

按照标准“ 如果字符串的数字值不能用int表示,则行为未定义 ” ,这是正确的。

但是,该部分并不完整,因为它没有提到0作为返回值,这可能会引起误解。短语“ ...不执行任何转换并返回零。” 在描述段落中之前已得到满足,但在“ 返回”部分中必须具有它。

cplusplus.com上给出的许多示例源代码都不正确。
查阅这些参考文献的许多新手都会导致犯错误。

举个例子:

编辑:我以前引用的示例不正确。


5
也许是巴兰特->公然?但是,ballant是法语中的“悬挂”,它可能适用于涉及指针的错误。
hardmath 2011年

重读该迭代器示例...没有未定义的行为。
2011年

1
您声明“ cplusplus.com上给出的许多示例源代码不正确。” 然后删除示例说“我之前引用的示例是错误的”。-那么为什么要删除该示例?:)
user2962533 '16

根据此站点,您描述的情况导致未定义的返回类型而不是未定义的行为。 en.cppreference.com/w/cpp/string/byte/atoi ; 但是,Cplusplus.com似乎更新了其文档以符合您的要求。显然,他们确实响应了社区的更正请求。不过,我不确定哪个网站最正确,因为有问题的两个网站的情况大相径庭。
shawn1874

此答案发布至今已有9年了。是否仍普遍认为Cplusplus.com包含大量不正确或不完整的信息?
泰勒·谢尔伯格

3

的文档type_info尝试typeid首先进行说明,但失败了:

typeid可以直接应用于类型,在这种情况下,它返回其信息;或对象,在这种情况下,它将返回有关对象类型的信息。

当将typeid应用于指向多态类类型的对象(声明或继承虚拟函数的类)的解引用指针时,它将考虑其动态类型(即,派生程度最高的对象的类型)。

现在第二段已经与第一段不同。在typeid(*ptr)typeid被施加到的表达式。这是非常必要的,因为staticand dynamic类型的概念仅在表达式的上下文中有意义,而在对象的上下文中才有意义。它还错过了类似的情况typeid(foo())

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


很好-RTTI问题以可预测的规律出现在SO上。很高兴知道参考什么。
Kerrek SB 2011年

3

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

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


这是强制性的,还是operator==在第二种情况下可以免费使用库(如果有操作员可用)?
Kerrek SB 2011年

1
必选 C ++标准不能operator==和混合使用operator<
MSalters 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.