cplusplus.comの何が問題になっていますか?


200

これはおそらくこの質問に完全に適したフォーラムではないかもしれませんが、退去させられる危険を冒して、私に試してみましょう。

貴重なISO規格を含むC ++標準ライブラリのためのいくつかの言及があるMSDNIBMcppreference、およびCPLUSPLUSは。個人的には、C ++を作成するときに、迅速なランダムアクセス、短い読み込み時間、および使用例を備えたリファレンスが必要であり、cplusplus.comはかなり便利だと感じていました。ただし、私はそのWebサイトについて否定的な意見を頻繁に聞いているため、具体的に知りたいと思います。

cplusplus.comからのエラー、誤解、悪いアドバイスは何ですか?コーディングの決定にそれを使用するリスクは何ですか?

この点を付け加えましょう:ここでSOに関する質問に標準の正確な引用で答えられるようにしたいので、すぐに使用できるリンクを投稿したいと思います。cplusplus.comは、この問題。


62
なぜ反対票?これは完全に有効な質問です。参照が必要な場合は、信頼できるソースが必要です。また、標準ライブラリのクイックリファレンスを入手できるcplusplus.comに対する苦情も聞いたので、これは興味深いものです。
Xeo

48
@オラファー:私は意見を望んでいません、そのサイトの間違いの具体的なリストを求めています。ない場合は、この質問を使用して将来の批判を払拭できるようにしたいと思います。
Kerrek SB、2011

4
@ÓlafurWaage:たぶん。しかし、そのウェブサイトのコンテンツの正確性/真実性について完全に客観的なポイントを立てることができます。
Daniel Sloof

14
すでにGoogleの「cplusplus.com」の1ページ目です。SOの質問がどれほど速く検索ランキングを上昇させるかは印象的です。
オービットでの軽さのレース

5
この質問が「cplusplus」の検索でどの程度ランク付けされているとしても、この質問が出されたため、cplusplus.comに多くの修正が加えられていることに注意してください。実際、間違いを指摘する上位3つの回答はもはや真実ではありません。
Mark H

回答:


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 が同様の動作で存在しますが、2つの反復子間で動作していることに注意してください。

これは完全に間違っています。グローバル削除、すなわちstd::remove類似していないlist::remove、我々は前者がいるのを見て、本当に削除しないコンテナからアイテムを、それができないので、後者(メンバ関数)に対し、実際に削除しない項目を、それは可能性があるため

この回答は、次のトピックの私の別の回答からほとんど変更されずにコピーされています。

注:上記のトピックで返信しているときに最近これに遭遇したので、覚えています。私が過去2年間に遭遇した多くのエラーがあり、それを覚えていません。再び出くわした場合、後でさらに追加する可能性があります。


1
+1:このサイトには、これらの間違った発言がもっとたくさんありますか?
Klaim、2011年

4
@Alexander:list::remove要素をコンテナから削除します。しかしstd::remove、要素をコンテナから削除しません。私がすることができない彼らの行動は「類似」していると言います。
Nawaz

3
ナイスキャッチ!それは私が探しているものの非常に良い例です。
Kerrek SB、2011

3
2つの異なる操作が類似しているかどうかは意見の問題なので、「類似」は議論の余地があります。また、cplusplus.comがドキュメンテーションとして偽装された意見を提供すべきかどうかについても議論があります。しかし、いずれにしても、「古い値を保持する」は許されないエラーであり、cplusplusの説明が標準に基づいていないことを示しているだけです。
スティーブジェソップ2011年

5
@スティーブ:あなたは言った"Similar" is debateable。単語が場合similar議論の余地がある、それは非常に多く、この単語が正しい単語ではないとの動作を説明する際に避けるべきであることを告げるstd::removelist::removeするので、説明はできるだけ明確にする必要があり、それは別の説明を要求すべきではありません。
Nawaz、2011年

38

私は少し反対の意見を述べるつもりです。cplusplus.comには多くの優れた情報があります。それを選んで死にます、そしてもちろん、もちろんそれには問題がありますが、どのサイトはそうではありませんか?確かにこのサイトで。ガラスの家に住んでいる人は石を投げてはいけません。ここにも誤報がたくさんあります。完全に間違った、反対投票の回答(一部否定的です!)である承認された回答は、正解です。

cplusplus.comの1つの問題は、それが閉じたサイトであることです。同じことが言及されている他のほとんどの参照サイトにも当てはまります。これは、Stack Overflowなどのコミュニティ開発サイトの粒度に反します。信頼できる編集を行う機能を取得するのにそれほど時間がかかりません。また、最新の初心者でも簡単に改善の提案を行うことができます。それをcplusplus.comと比較してください。スタッフがいない場合、あなたは永遠の初心者です。あなたがWG21の主要メンバーである場合でも、そのサイトのどこかにバグを見つけたら、彼らの電子メールレポートメカニズムに目を通す必要があります。アナセマ!

このサイトでは、独自のC ++リファレンスを開発するための解決策があります。これにはかなりの作業が必要になります。知識が多すぎたり、専門的すぎたりしないように注意する必要があります。cplusplus.comが、少なくとも2、3人の技術編集者を雇い、ペダントを寄せ付けないことは明らかです。情報を適切に整理する必要があります。ここのFAQはよく整理されていません。また、標準から直接大量に噴出しないように注意する必要があります。それは違法です。


7
以前はcppreference.comに頻繁にアクセスしていましたが、今ではwiki風に変更されています(誰でも編集できるようになっていますか?)...そして、私はそれが好きではなくなっています。重要な情報を見るのは難しいと思います。それは私がcplusplus.comから得る即時の満足感を欠いているだけです。おもう。
Kerrek SB、2011

14
うわあ!私は正反対を参照してください。古いcppreference.comを利用するのはやめました。トラバースが難しく、記述が不十分だったからです。新しいcppreference.comは、広告なしのコミュニティベースのサイトのようです。これは、前の段落で提案したとおりのことを行います。
David Hammen、2011年

1
多分それは私だけだったので、もう一度試してみましょう。私はいくつか調べてみたかったと思う<thread>か、<atomic>ものを、私はあきらめたように、単に「このページを書いてください」しまいました。もう一度確認させてください!ああ、C ++ 0xのサポートはもちろん大きなボーナスです。
Kerrek SB、2011

10
「ガラスの家に住んでいる人は石を投げてはいけません。」SOは、cplusplus.com / referenceと異なり、(部分的に)C ++のライブラリ参照であると主張していません。ここで人々が主張するとき、彼らはそれらをバックアップするための標準を引用します、または彼らがそうしないなら、誰かが一緒に来て記入します。彼らが間違っているなら、あなたは彼らの働きを見ることができます。cplusplus.comが間違っている場合、作成者が「その要素の詳細な説明」を作成するために使用したもの以外の一部のC ++実装で失敗するコードを記述しただけです。問題は、cplusplus.comは非公式ですが、正式に見えるように作成されていることです。
Steve Jessop、2011年

4
SOは非公式であり、非公式に見えるように書かれています。さて、cplusplus.comが正確なドキュメンテーション/参照資料であるように意図されておらず、十分に公平などこかで免責事項を見逃した場合、サイト自体ではなく、そのように使用する人々に石を投げると想定してください。しかし、要点は、cplusplus.comがC ++関数について何かを言っているからといって、それが真実であるとは限らないということです。これをクイックリファレンスとして使用する場合は、知っておく価値があります。関数のシグネチャを検索するために使用しますが、コードが準拠しているかどうかにかかわらず、細かい点を解決することはありません。
スティーブジェソップ2011年

14

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

「重複するオブジェクト間でコピーが行われた場合の動作は定義されていません。」(C89標準の4.11.2.4。C++ 03が実際に参照するC90のコピーはありませんが、ページ番号などの違いだけが想定されています。)


ああ、古いCライブラリ...いいですね。
Kerrek SB、2011

6
彼らは言及し destination and source shall not overlapます。
スナイパー

2
@Sniperある「重複してはならない」ではない「動作が定義されていません」と同じ。あなたのコメントは実際にcplusplus.comの微妙で広範囲にわたる失敗の1つを明らかにしています-それは正しく聞こえますが、それは正しくありません。
Andrew Henle

@スナイパー:2011年にこの答えを出したとき、おそらくそれは言わなかったと思います。入力に対する十分な制約として「重複してはならない」と考えたでしょう。
スティーブジェソップ

9

cplusplus.comによって提供されるドキュメントは、多くの場合、不正確または不完全です。

そのような例がになると、atoicplusplus.com のドキュメントです。

atoi
戻り値のセクションでは、関数の使用中に変換を実行できない場合、戻り値0について言及されていません。

cplusplus.comの戻りセクションには、「変換された値がintによって表現可能な値の範囲外になると、未定義の動作が発生します」と記載されています。

これは、標準に従って正しいです。「文字列の数値をintで表現できない場合、動作は未定義です」。

ただし、戻り値として0が記載されていないため、セクションはいっぱいではなく、誤解を招く可能性があります。「...変換は実行されず、ゼロが返されます。」という句。は説明パラグラフで以前に満たされていますが、リターンセクションにあることが不可欠です。

cplusplus.comで提供されているサンプルソースコードの多くは正しくありません。
これらの参照を探している初心者の多くは、ばかげた過ちを犯すことにつながります。

例を挙げます:

編集:前に引用した例は正しくありませんでした。


5
おそらくバラン->露骨ですか?ただし、ballantはフランス語の「ぶら下がり」を意味し、ポインタに関連するエラーに適している可能性があります。
hardmath

そのイテレータの例をもう一度読んでください。未定義の動作はありません。
Dennis Zickefoose

1
「cplusplus.comに記載されているサンプルソースコードの多くが正しくない」と宣言しました。次に、「私が以前に引用した例は正しくなかった」という例を削除しました。-では、なぜその例を削除したのですか?:)
user2962533

このサイトによると、あなたが説明するケースは、未定義の動作ではなく未定義の戻り値型になります。 en.cppreference.com/w/cpp/string/byte/atoi ; ただし、Cplusplus.comがドキュメントを更新して、あなたの言っていることと一致しているようです。明らかに、彼らはコミュニティの修正要求に応えます。それでも、問題の2つが非常に異なることを述べているため、どちらのWebサイトが最も正しいかわかりません。
shawn1874 2017年

この回答が投稿されてから9年になります。Cplusplus.comにかなりの量の不正確または不完全な情報が含まれていると一般に信じられていますか?
タイラーシェルバーグ

3

のドキュメントは最初type_infoに説明しようとしましたtypeidが失敗しました:

typeidはタイプに直接適用でき、その場合は情報を返します。またはオブジェクトに対して。その場合、オブジェクトのタイプに関する情報を返します。

typeidが、ポリモーフィッククラスタイプ(仮想関数を宣言または継承するクラス)のオブジェクトへの逆参照ポインターに適用される場合、その動的タイプ(つまり、最も派生したオブジェクトのタイプ)を考慮します。

現在、2番目の段落はすでに1番目の段落に同意していません。ではtypeid(*ptr)typeid式に適用されます。staticdynamic型の概念はオブジェクトではなく式のコンテキストでのみ意味があるため、これはかなり重要です。また、次のような場合も見逃しますtypeid(foo())ます。

さらに、2番目の段落では参照を省略しています。それらも、参照するオブジェクトの動的タイプとは異なる静的タイプを持つことができます。


とても良いです-RTTIの質問は、予測可能な規則性でSOに出てきます。参照しないものを知っておくと便利です。
Kerrek SB、2011

3

のドキュメントにstd::pair<T1,T2>::operator==は、両方の要素が等しいかどうかがテストされていると記載されています。のドキュメントstd::pair<T1,T2>::operator<は、最初の要素が等しい場合にのみ2番目の要素が考慮されると述べています。

「等しい」という単語はどちらの場合にも表示されます。しかし、それは本当に最初のケースでのみ意味しT::operator==ます。2番目のケースでは、等しいとは!(a.first<b.first || b.first<a.first)


これは必須ですか、それともoperator==、オペレーターが対応可能な場合、2番目のケースではライブラリを自由に使用できますか?
Kerrek SB、2011

1
必須。C ++標準では、混合しないoperator==operator<
MSalters 2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.