这也许不是一个完全适合这个问题的论坛,但让我试一试,冒着被移走的危险。
对于C++标准库有几个引用,包括宝贵的ISO标准、MSDN、IBM、CPP首选和CPLUS PLUS。就个人而言,在编写C++时,我需要一个具有快速随机访问、短加载时间和使用示例的引用,并且我发现CPLUSPPLUS非常有用。但是,我经常在这里听到关于那个网站的负面意见,所以我想具体说明一下:
cplusplus.com给出的错误、误解或错误建议是什么?使用它进行编码决策有什么风险?
让我再补充一点:我想在这里用标准的准确引用回答问题,因此我想立即发布可用的链接,如果不是这个问题,cplusplus.com将是我的首选网站。
- 你能把你的问题说得更具体些吗?你在哪里发现了负面意见?部分原因?
- 为什么投反对票?这是一个完全正确的问题。如果需要引用,则需要可信的源。我还听到了对cplusplus.com的投诉,在那里我可以快速获得标准库的参考资料,因此,这很有趣。
- @巴尔基:反馈是零散的,但经常有人引用cplusplus.com作为某个库功能或其他库功能的参考,其他人会评论该网站的质量差作为参考。有时甚至作者自己也会在引用网站前加上警告。我只是想避免使用不完整的引用,特别是因为我喜欢用权威的引用来回答其他问题!
- 这个问题可能比实际答案更能吸引个人的意见。
- @奥拉福尔:我不想发表意见,我想在那个网站上列出具体的错误清单。如果没有,我想用这个问题来消除未来的批评。
- @Ó;拉弗·瓦奇:也许吧。但是,可以对该网站内容的准确性/真实性提出完全客观的观点。
- @Kerrek:这个网站没有权威性,所以你不能把它的内容当面看,但是我们鼓励人们报告发现的错误,所以我猜(并且希望)任何实际错误的列表都是无效的,因为它会导致他们的改正。
- 如示例所示,显示一些错误,无论将来是否应该使用,都会给人一种良好的感觉。是否存在一些基本错误或仅可接受的小字体?!imho这是一个有效的问题。好吧,这不是一个论坛,但这是一个知识的地方,这个问题属于它。
- 虽然在cplusplus.com上肯定有错误的信息(哪个百科全书总是正确的?)我认为公平地说,它本身没有什么问题。这是一个很好和可靠的信息来源。它快速加载并提供了C++标准库的优秀覆盖率。
- @马蒂厄:当然,只有标准是权威的。但在我偶尔采样的时候,我总是发现这个网站是准确的。我的问题是它到底出了什么问题。一个标准的精确复制品完全可以。
- @Deadmg:我指的是"论坛"的原意,而不是互联网技术术语。抱歉,可能是后知后觉的词选得不好。
- 我以前在那个网站上报告过错误,而且很快就解决了。也许我在这方面很幸运,但这有很大的潜力迅速成为Q系列过时的答案。
- "标准的准确引用"—cplusplus.com显然不足以满足这一特殊目的,因为它没有引用标准,而是对其进行了解释。
- 把这个变成维基?
- 这可能是或不可能是严格的主题;我不能真正决定。然而有一件事是肯定的:这是需要覆盖的重要基础。所以我们把它留着,看看它带我们去哪里。
- 我们已经在google上的"cplusplus.com"的第一页了。让人印象深刻的是,这样的问题能以多快的速度爬上搜索排名。
- @凯瑞克:在整个参考资料中,要求一份完整的所有打字错误、错误和错误的清单并不适合这样做,而且无论如何都是不可能的。我们所能做的最好的就是给出一些例子,并更全面地了解为什么向某人推荐它是一种糟糕的资源。
- @托马莱克:我对出现的答案很满意。选择一些选择错误和误导性信息是一个很好的开始。
- @凯瑞克:很好,很好:)
- @大卫:我不想让cplusplus成为更好的网站,我也不抱怨。我只是希望有足够的理由对这个网站保持警惕,否则我会把它当作一个可靠的资源并用于争论。由于站点是我(以及许多其他人)编程时的主要工具之一,因此这是一个与编程相关的实际而直接的问题。
- @大卫:我认为重点是提供证据支持(或反对,但船已经在这方面航行了)共同的主张,"cplusplus.com不太准确"。如果您经常将该站点用作快速参考,这是"显而易见的",但不一定容易向那些认为cplusplus.com准确或权威的人清楚地展示。然而,关于编程资源的问题,或者除了"我如何在Y环境中做X"以外的其他问题,在这里越来越不受欢迎,至少有5人需要关闭它们,因此,评估C++资源不再是"建设性的"是正确的。
- 我认为这是公平的——考虑到这个问题在"cplusplus"搜索中的排名有多高——要注意的是,自从这个问题被提出以来,已经对cplusplus.com做了一些修改。事实上,指出错误的前三个答案不再是正确的。
- 我从cplusplus.com切换到cppreference.com的原因是前者的加载时间非常长。
- str.append(5,0x2E);示例不编译
编辑:此答案编写后,已修复std::remove的文档。同样的事情也适用于list::remove。
让我给你举个例子来说明cpluscplus.com是如何出错的。
考虑来自的std::remove函数。
事实上,std::remove不会从容器中移除该项。这是因为std::remove只与一对迭代器一起工作,对实际包含这些项的容器一无所知。实际上,std::remove不可能知道底层容器,因为它无法从一对迭代器中找到迭代器所属的容器。所以std::remove并没有真正删除这些项目,仅仅是因为它不能。从容器中实际删除项的唯一方法是调用该容器上的成员函数。
因此,如果要删除这些项,请使用"删除删除"习惯用法:
1
| v.erase(std::remove(v.begin(), v.end(), 10), v.end()); |
但是cplusplus.com给出了关于std::remove的错误信息。它说
Notice that this function does not alter the elements past the new end, which keep their old values and are still accessible.
这是不对的。范围[new_end, old_end)中的迭代器仍然是不可引用的,但这并不意味着它们保留旧值并且仍然可以访问。未指明。
同样,cplusplus.com也给出了关于list::remove的错误信息。它说,
Notice that a global algorithm function, remove, exists with a similar behavior but operating between two iterators.
这是完全错误的。全局删除,即std::remove与list::remove不同,因为我们看到前者不能真正从容器中删除项目,而后者(成员函数)确实可以删除项目,因为它可以。
此答案是从我在以下主题中的另一个答案中复制的,几乎没有修改:
注:由于我最近在回答上述主题时遇到了这个问题,所以我记得。在过去的两年里,我遇到了很多错误,但我不记得了。如果我再遇到的话,我可能会再增加一些。
- +1:这个网站上还有很多不正确的说法吗?
- @ Klaim:是的。但这是我最近遇到的,所以我记得。
- 它说"类似"的行为,实际上,list::remove和std::remove有类似的行为。后者不能从序列中删除元素是显而易见的,不需要进一步的注释,尽管我同意这会混淆初学者。
- @亚历山大:list::remove确实从容器中删除了元素。但是std::remove并没有从容器中移除元素。我不能说他们的行为"相似"。
- 好抓!这是我要找的东西的一个很好的例子。
- @纳瓦兹,我认为他明白这一点,是的,他们有"相似"的行为,你必须仔细观察以东的行为。
- "相似"是有争议的,因为两种不同的操作是否相似是一个意见问题。CPlusplus.com是否应该提供伪装成文档的意见也是有争议的。但是不管怎样,"保留旧值"是一个不可原谅的错误,它只是表明cplusplus描述不是基于标准的。
- "不可原谅"当然是指"除非它是固定的"。我不是说我会无限期地怀恨…
- 关于"相似":我将调用std::remove和std::list::remove的行为"相似"。当然,标准委员会认为这些行动"相似"到足以同名。cplusplus解释的问题归根结底是它错误地给出了[new_last,last]中未指明的内容的特定性。
- @史蒂夫:这会让我无限期地怀疑一般质量。
- @史提夫:你说的是江户十一〔五〕。如果similar这个词有争议,那么它非常清楚地表明这个词不是正确的词,在解释std::remove和list::remove的行为时应该避免,因为一个解释应该尽可能清楚,不需要另一个解释。
我要提出一个稍微相反的意见。在cplusplus.com上有很多好的信息。选择它到死,是的,当然它有它的问题,但什么网站没有?当然不是这个网站。住在玻璃房子里的人不应该扔石头。这里也有很多错误信息。有公认的答案是完全错误的,被否决的答案(有些是否定的!)那是正确的。
cplusplus.com的一个问题是它是一个封闭的站点;对于提到的大多数其他参考站点也是如此。这与社区开发站点(如堆栈溢出)的粒度不符。获得可信编辑的能力并不需要那么长时间,即使是最新的新手也可以很容易地提出改进建议。将其与cplusplus.com进行比较。如果你不在他们的工作人员中,你是一个永远的新手。即使您是wg21的关键成员,如果您在该站点的某个地方看到一个bug,您也必须通过他们的电子邮件报告机制。诅咒!
一个解决方案将是我们在这个网站上开发我们自己的C++参考。这需要相当多的工作。我们必须小心,不要太学究/太技术化;很明显,cplusplus.com至少雇佣了一些技术编辑,让这些学究望而却步。我们必须保持信息井然有序;这里的常见问题解答没有井然有序。我们还必须非常小心,不要直接从标准中说太多,这是违法的。
- 我以前经常访问旧的cppreference.com,但现在他们把它改成了wiki风格的(每个人都可以编辑它吗?)…我不再喜欢它了。我发现很难看到重要的信息。它只是缺少我从cplusplus.com得到的即时满足。我想.
- 哇!我看到的恰恰相反。我不再频繁访问旧的cppreference.com,因为我发现它很难遍历,而且写得很糟糕。新的cppreference.com似乎是一个无广告、基于社区的网站,完全按照我在上一段中的建议执行。
- 也许只是我一个人,我要再试一次。我想我想查一些或的资料,结果得到了"请写这一页"就放弃了。让我再检查一遍!哦,C++0X的支持当然是一个巨大的奖励!
- "住在玻璃房子里的人不应该扔石头。"因此,它并不声称(部分地)是CPLUS的库引用。当人们在这里提出要求时,他们引用了支持他们的标准,或者如果他们不这样做,那么就会有其他人来填补。如果他们错了,你可以看到他们的工作。如果CPLUPLPLUS是错误的,您只写了一些代码,它将失败于一些C++实现,而不是作者用来生成"元素的详细描述"的代码。问题是cplusplus.com是非正式的,但写得看起来很正式。
- 所以是非正式的,写得看起来是非正式的。现在,如果cplusplus.com不打算成为准确的文档/参考资料,并且我错过了一个足够公平的免责声明,那么假设有任何石头会扔给使用它的人,而不是网站本身。但关键是,因为CPLUSPPLUS网站说了一些关于C++函数并不意味着它是真的,而且如果你打算用它作为一个快速引用,就值得知道。我使用它来查找函数签名,但从不解决我的代码是否符合这一点。
http://www.cplusplus.com/reference/clibrary/cstring/strncpy/
没有提到"如果复制发生在重叠的对象之间,则行为是未定义的"(C89标准中的4.11.2.4)。我没有一个拷贝到C90的手,这是C++ 03实际上提到的,但是它们应该只在页面编号之类的东西上有所不同。
- 啊,旧的C图书馆…很好。
- 他们提到了以东十一〔九〕。
cplusplus.com提供的文档通常不正确或不完整。
一旦出现这样的例子,cplusplus.com上的atoi文档。
字符串转换为整数在返回部分中,如果在使用函数时无法执行转换,则不会提及0返回值。
cplusplus.com返回部分声明"…如果转换的值将超出int可表示值的范围,则会导致未定义的行为。"
这是正确的,根据标准"如果字符串的数值不能用in t表示,那么行为是未定义的"。
但是,该部分不完整,因为它没有提到0作为返回值,这可能会产生误导。短语"…不执行转换,返回零。"在描述段落之前已满足,但在返回部分必须满足。
cplusplus.com上给出的许多示例源代码都不正确。许多新来的人看到这些参考文献都会导致民谣错误。
举个例子:
编辑:我之前引用的例子不正确。
- 也许是民谣->明目张胆?然而,民谣是法语中的"悬空"一词,可能与涉及指针的错误有关。
- 重读该迭代器示例…没有未定义的行为。
- 您声明"cplusplus.com上给出的许多示例源代码都不正确",然后删除了一个示例,说明"我之前引用的示例不正确"。-那么,为什么要删除该示例?:)
- 根据这个站点,您描述的情况会导致未定义的返回类型而不是未定义的行为。en.cppreference.com/w/cpp/string/byte/atoi;但是,看起来cplusplus.com更新了文档以匹配您所说的内容。很明显,他们确实回应了社区的改正请求。不过,我不确定哪一个网站是最正确的,因为这两个问题的状态非常不同。
std::pair::operator==的文件表明,这两种元素都经过了平等性测试。std::pair::operator<的文件表明,只有当第一个元素相等时,才考虑第二个元素。
两种情况下都会出现"相等"一词。然而,只有在第一种情况下,它才真正意味着T::operator==。在第二种情况下,相等意味着!(a.first
- 这是强制性的,还是在第二种情况下,如果操作员可用,库可以自由使用operator==?
- 强制性的。C++标准不混合EDCOX1、0和EDCOX1×2。
type_info的文档首先试图解释typeid,但失败了:
typeid can be applied directly to
types, in which case it returns its
information; Or to objects, in which
case it returns information on the
type of the object.
When typeid is applied to a
dereferenced pointer to an object of a
polymorphic class type (a class
declaring or inheriting a virtual
function), it considers its dynamic
type (i.e., the type of the most
derived object).
现在第二段已经和第一段不一致了。在typeid(*ptr)中,typeid应用于表达式。这是相当重要的,因为static和dynamic类型的概念只在表达式上下文中有意义,而不是对象。它还漏掉了像typeid(foo())这样的案例。
此外,第二段省略了参考文献。它们也可以具有不同于所引用对象的动态类型的静态类型。
- 非常好-RTTI问题会以可预测的规律出现。很高兴知道什么不值得参考。