เกิดอะไรขึ้นกับ cplusplus.com


200

นี่อาจไม่ใช่ฟอรัมที่เหมาะสมอย่างสมบูรณ์แบบสำหรับคำถามนี้ แต่ให้ฉันลองดูด้วยความเสี่ยงที่จะถูกย้ายออกไป

มีหลายที่อ้างอิงสำหรับไลบรารีมาตรฐาน C ++ รวมทั้งมาตรฐาน ISO ที่ทรงคุณค่ามีMSDN , IBM , cppreferenceและcplusplus โดยส่วนตัวเมื่อเขียน C ++ ฉันต้องการการอ้างอิงที่มีการเข้าถึงแบบสุ่มอย่างรวดเร็วเวลาโหลดสั้นและตัวอย่างการใช้งานและฉันได้พบว่า cplusplus.com มีประโยชน์มาก อย่างไรก็ตามฉันได้รับฟังความคิดเห็นเชิงลบเกี่ยวกับเว็บไซต์นั้นบ่อยครั้งที่นี่ดังนั้นฉันจึงต้องการเจาะจง:

ข้อผิดพลาดความเข้าใจผิดหรือคำแนะนำที่ไม่ดีที่ได้รับจาก cplusplus.com คืออะไร อะไรคือความเสี่ยงของการใช้มันเพื่อตัดสินใจการเข้ารหัส?

ให้ฉันเพิ่มจุดนี้: ฉันต้องการที่จะสามารถตอบคำถามที่นี่ใน SO ด้วยคำพูดที่ถูกต้องของมาตรฐานและดังนั้นฉันต้องการโพสต์ลิงค์ที่ใช้งานได้ทันทีและ cplusplus.com จะเป็นเว็บไซต์ที่ฉันเลือกไม่ได้ ปัญหานี้


62
ทำไมต้องลงคะแนน? นี่เป็นคำถามที่ถูกต้องสมบูรณ์ หากคุณต้องการการอ้างอิงคุณต้องการแหล่งที่เชื่อถือได้ ฉันยังได้ยินข้อร้องเรียนกับ cplusplus.com ซึ่งฉันสามารถรับการอ้างอิงด่วนสำหรับไลบรารีมาตรฐานและเช่นนี้เป็นสิ่งที่น่าสนใจ
Xeo

48
@Olafur: ฉันไม่ต้องการความคิดเห็นฉันต้องการรายการที่เป็นรูปธรรมของข้อผิดพลาดในเว็บไซต์นั้น หากไม่มีเลยฉันต้องการใช้คำถามนี้เพื่อปัดเป่าการวิจารณ์ในอนาคต
Kerrek SB

4
@ Ólafur Waage: อาจจะ แต่จุดประสงค์ที่สมบูรณ์แบบสามารถทำได้เกี่ยวกับความถูกต้อง / ความจริงของเนื้อหาของเว็บไซต์นั้น
Daniel Sloof

14
เราอยู่ในหน้าเดียวสำหรับ "cplusplus.com" บน Google เป็นเรื่องที่น่าประทับใจว่าคำถาม SO นั้นจะไต่อันดับการค้นหาได้อย่างรวดเร็ว
การแข่งขัน Lightness ใน Orbit

5
ฉันคิดว่ามันยุติธรรม - เนื่องจากคำถามนี้มีการจัดอันดับการค้นหา "cplusplus" สูงเพียงใด - เพื่อให้ทราบว่าเนื่องจากคำถามนี้ถูกถาม ในความเป็นจริงคำตอบสามข้อแรกที่ชี้ให้เห็นข้อผิดพลาดนั้นไม่เป็นความจริงอีกต่อไป
Mark H

คำตอบ:


72

แก้ไข:เอกสารสำหรับstd::removeได้รับการแก้ไขตั้งแต่คำตอบนี้ถูกเขียน list::removeสิ่งเดียวที่จะนำไปใช้

ให้ฉันยกตัวอย่างให้คุณดูว่า cpluscplus.com จะทำให้มันผิดได้อย่างไร

พิจารณาฟังก์ชั่นจากstd::remove<algorithm>

ความจริงก็คือstd::removeว่าไม่ได้ลบรายการจากภาชนะ มันเป็นเพราะstd::removeทำงานร่วมกับ iterators คู่เดียวเท่านั้นและไม่ทราบอะไรเกี่ยวกับภาชนะที่บรรจุสิ่งของจริงๆ ในความเป็นจริงมันเป็นไปไม่ได้ที่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เช่นกัน มันบอกว่า ,

ขอให้สังเกตว่าฟังก์ชั่นอัลกอริทึมทั่วโลกลบอยู่กับพฤติกรรมที่คล้ายกันแต่การดำเนินงานระหว่างสองซ้ำ

ซึ่งผิดอย่างสมบูรณ์ เอาโลกคือstd::removeไม่ได้คล้ายกับlist::removeที่เราเห็นว่าอดีตไม่ได้โดดลบรายการจากภาชนะเพราะมันไม่สามารถในขณะที่หลัง (ฟังก์ชั่นสมาชิก) จริงๆไม่เอารายการเพราะมันสามารถ

คำตอบนี้ถูกคัดลอกมาจากคำตอบอื่นในหัวข้อต่อไปนี้โดยมีการดัดแปลงเล็กน้อย:

หมายเหตุ:เมื่อไม่นานมานี้เมื่อฉันตอบกระทู้ในหัวข้อด้านบนฉันจำได้ มีข้อผิดพลาดมากมายที่ฉันเจอในช่วงสองปีที่ผ่านมาซึ่งฉันจำไม่ได้ ฉันอาจเพิ่มอีกไม่กี่ในภายหลังถ้าฉันเจออีกครั้ง


1
+1: มีคำสั่งที่ไม่ถูกต้องจำนวนมากบนไซต์นี้หรือไม่
Klaim

4
@Alexander: list::removeจะลบองค์ประกอบจากภาชนะ แต่std::removeไม่ลบองค์ประกอบออกจากคอนเทนเนอร์ ฉันไม่สามารถพูดได้ว่าพฤติกรรมของพวกเขา "คล้ายกัน"
Nawaz

3
รับได้สวย! นั่นเป็นตัวอย่างที่ดีมากสำหรับสิ่งที่ฉันกำลังมองหา
Kerrek SB

3
"Similar" สามารถโต้เถียงได้เนื่องจากเป็นเรื่องของความเห็นว่าการดำเนินการที่แตกต่างกันสองแบบนั้นเหมือนกันหรือไม่ นอกจากนี้ยังสามารถถกเถียงกันได้ว่า cplusplus.com ควรเสนอความคิดเห็นที่ปลอมแปลงเป็นเอกสารหรือไม่ แต่อย่างไรก็ตาม "การรักษาคุณค่าเดิมของพวกเขา" เป็นข้อผิดพลาดที่ไม่สามารถคาดการณ์ได้มันแสดงให้เห็นว่าคำอธิบาย cplusplus ไม่ได้ขึ้นอยู่กับมาตรฐาน
Steve Jessop

5
@ Steve: "Similar" is debateableคุณบอกว่า หากคำsimilarนี้เป็นที่ถกเถียงกันมันจะบอกว่าคำนี้ไม่ใช่คำที่ถูกต้องและควรหลีกเลี่ยงเมื่ออธิบายพฤติกรรมของstd::removeและlist::removeเนื่องจากคำอธิบายควรมีความชัดเจนมากที่สุดเท่าที่จะทำได้
Nawaz

38

ฉันจะเสนอความเห็นเล็กน้อยไปในทางตรงกันข้าม มีข้อมูลที่ดีมากมายใน cplusplus.com เลือกที่จะตายและใช่แน่นอนมันมีปัญหา แต่สิ่งที่เว็บไซต์ไม่ได้? ไม่แน่นอนเว็บไซต์นี้ คนที่อาศัยอยู่ในเรือนกระจกไม่ควรโยนก้อนหิน มีข้อมูลที่ผิดมากมายที่นี่เช่นกัน มีคำตอบที่ยอมรับซึ่งถูกแบนออกผิดคำตอบ downvote (ลบบาง!) ที่ถูกต้อง

ปัญหาหนึ่งของ cplusplus.com คือเว็บไซต์ดังกล่าวเป็นเว็บไซต์ปิด เช่นเดียวกันกับเว็บไซต์อ้างอิงอื่น ๆ ส่วนใหญ่ที่กล่าวถึง สิ่งนี้ขัดกับธัญพืชของไซต์ที่พัฒนาโดยชุมชนเช่น Stack Overflow การได้รับความสามารถในการแก้ไขที่เชื่อถือได้นั้นใช้เวลาไม่นานนักและแม้แต่มือใหม่รุ่นใหม่ล่าสุดก็สามารถให้คำแนะนำในการปรับปรุงได้อย่างง่ายดาย เปรียบเทียบกับ cplusplus.com คุณเป็นมือใหม่ตลอดหากคุณไม่ได้อยู่ในทีมงานของพวกเขา แม้ว่าคุณจะเป็นสมาชิกคนสำคัญของ WG21 คุณจะต้องผ่านกลไกการรายงานทางอีเมลของพวกเขาหากคุณเห็นข้อผิดพลาดบางแห่งในไซต์นั้น คำสาปแช่ง!

ทางออกสำหรับเราที่ไซต์นี้เพื่อพัฒนาการอ้างอิง C ++ ของเราเอง การทำงานนี้ค่อนข้างใช้เวลาสักหน่อย เราจะต้องระมัดระวังไม่ให้มีความเชื่องช้า / มีเทคนิคเกินไป เป็นที่ชัดเจนว่า cplusplus.com มีพนักงานด้านเทคนิคอย่างน้อยสองสามคนที่คอยดูแลคนเดินถนน เราจะต้องจัดเก็บข้อมูลอย่างดี คำถามที่พบบ่อยที่นี่มีการจัดระเบียบไม่ดี เราจะต้องระมัดระวังเป็นอย่างมากที่จะไม่พวยตรงจากมาตรฐานมากเกินไป มันผิดกฎหมาย


7
ฉันเคยใช้ cppreference.com บ่อยครั้ง แต่ตอนนี้พวกเขาได้ปรับปรุงมันเป็นสิ่งที่ wiki-ish (เปิดให้ทุกคนแก้ไขได้หรือไม่) ... และฉันไม่ชอบมันอีกต่อไป ฉันพบข้อมูลที่สำคัญได้ยาก มันขาดความพึงพอใจทันทีที่ฉันได้รับจาก cplusplus.com ฉันคิด.
Kerrek SB

14
โว้ว! ฉันเห็นสิ่งที่ตรงกันข้าม ฉันหยุดบ่อย cppreference.com เก่าเพราะฉันพบว่ามันยากที่จะสำรวจและเขียนไม่ดี cppreference.com ใหม่ดูเหมือนจะเป็นเว็บไซต์ที่ปราศจากโฆษณาซึ่งทำตามสิ่งที่ฉันแนะนำในย่อหน้าสุดท้ายของฉัน
David Hammen

1
อาจจะเป็นแค่ฉันฉันจะลองอีกครั้ง ผมคิดว่าผมอยากจะมองขึ้นไปบางส่วน<thread>หรือ<atomic>สิ่งและเพียงแค่มี "โปรดเขียนหน้านี้" ดังนั้นผมจึงให้ขึ้น ให้ฉันตรวจสอบอีกครั้ง! แน่นอนว่าการสนับสนุน C ++ 0x จะเป็นโบนัสมาก!
Kerrek SB

10
"คนที่อาศัยอยู่ในเรือนกระจกไม่ควรขว้างก้อนหิน" ดังนั้นไม่ได้อ้างว่าเป็นส่วนหนึ่งของการอ้างอิงไลบรารีสำหรับ C ++ ตามที่cplusplus.com/referenceทำ เมื่อผู้คนอ้างสิทธิ์ที่นี่พวกเขาอ้างถึงมาตรฐานในการสำรองพวกเขาหรือหากพวกเขาไม่ทำเช่นนั้นคนอื่นก็มาเติมเต็มหากพวกเขาทำผิดคุณสามารถเห็นการทำงานของพวกเขาได้ หาก cplusplus.com ผิดคุณเพียงแค่เขียนโค้ดที่จะล้มเหลวในการใช้งาน C ++ บางอย่างนอกเหนือจากรหัสที่ผู้เขียนเคยสร้าง "คำอธิบายโดยละเอียดขององค์ประกอบ" ปัญหาคือ cplusplus.com เป็นทางการ แต่เขียนให้ดูเป็นทางการ
Steve Jessop

4
ดังนั้นเป็นทางการและเขียนให้ดูเป็นทางการ ตอนนี้หาก cplusplus.com ไม่ได้ตั้งใจให้เป็นเอกสาร / เอกสารอ้างอิงที่ถูกต้องและฉันพลาดข้อจำกัดความรับผิดชอบไปแล้วพอสมควรให้เอาก้อนหินโยนใส่คนที่ใช้วิธีนี้แทนที่จะเป็นเว็บไซต์ แต่ประเด็นก็คือเพราะ cplusplus.com พูดถึงบางสิ่งบางอย่างเกี่ยวกับฟังก์ชั่น C ++ ไม่ได้หมายความว่ามันเป็นเรื่องจริงและมันก็คุ้มค่าที่จะรู้ว่าถ้าคุณวางแผนที่จะใช้มันเป็นข้อมูลอ้างอิงอย่างรวดเร็ว ฉันใช้เพื่อค้นหาลายเซ็นของฟังก์ชั่น แต่ไม่เคยที่จะตัดสินว่ารหัสของฉันสอดคล้องหรือไม่
Steve Jessop

14

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

ไม่สามารถพูดถึงว่า "หากการคัดลอกเกิดขึ้นระหว่างวัตถุที่ทับซ้อนกันพฤติกรรมจะไม่ได้กำหนด" (4.11.2.4 ในมาตรฐาน C89 ฉันไม่มีสำเนาถึงมือของ C90 ซึ่งเป็นสิ่งที่ C ++ 03 อ้างถึงจริง ๆ แต่พวกเขาควรจะแตกต่างกันเฉพาะในสิ่งต่าง ๆ เช่นการกำหนดหมายเลขหน้า)


อ่าห้องสมุดซีเก่า ... ดี
Kerrek SB

6
destination and source shall not overlapพวกเขาพูดถึง
Sniper

2
@Sniper "จะไม่ทับซ้อน" ไม่เหมือนกับ "พฤติกรรมไม่ได้กำหนด" ความคิดเห็นของคุณจริง ๆ แล้วสว่างอย่างใดอย่างหนึ่งของความล้มเหลวที่แพร่หลายและแพร่หลายของ cplusplus.com - ฟังดูดี แต่มันไม่ถูกต้อง
Andrew Henle

@ Sniper: ฉันคิดว่าคงไม่ได้พูดว่าเมื่อฉันทำคำตอบนี้ในปี 2011 ฉันจะใช้ "จะไม่ทับซ้อนกัน" เป็นข้อ จำกัด เพียงพอในการป้อนข้อมูล
Steve Jessop

9

เอกสารที่ให้โดย cplusplus.com มักจะไม่ถูกต้องหรือไม่สมบูรณ์

เมื่อตัวอย่างดังกล่าวเป็นatoiเอกสารใน cplusplus.com

atoi
ในส่วน Return ไม่มีการกล่าวถึงค่าตอบแทน 0 หากไม่มีการแปลงใด ๆ ที่สามารถทำได้ในขณะที่ใช้ฟังก์ชั่น

cplusplus.com สถานะส่วนส่งคืน "... หากค่าที่แปลงแล้วจะอยู่นอกช่วงของค่าที่สามารถแทนได้โดย int จะทำให้เกิดพฤติกรรมที่ไม่ได้กำหนด"

สิ่งนี้ถูกต้องตามมาตรฐาน " หากค่าตัวเลขของสตริงไม่สามารถแสดงใน int ได้พฤติกรรมจะไม่ได้กำหนด "

อย่างไรก็ตามส่วนไม่เต็มเนื่องจากไม่ได้ระบุว่า 0 เป็นค่าส่งคืนซึ่งอาจทำให้เข้าใจผิด วลี "... ไม่มีการแปลงและส่งคืนค่าศูนย์" ถูกพบมาก่อนในย่อหน้าคำอธิบาย แต่จำเป็นที่จะต้องมีในส่วนReturn

ตัวอย่างซอร์สโค้ดจำนวนมากที่ให้ใน cplusplus.com นั้นไม่ถูกต้อง
มือใหม่จำนวนมากที่ค้นหาข้อมูลอ้างอิงเหล่านี้จะนำไปสู่ข้อผิดพลาดของ ballant

ในการอ้างถึงตัวอย่าง:

แก้ไข: ตัวอย่างที่ฉันอ้างถึงก่อนหน้านี้ไม่ถูกต้อง


5
บางที ballant -> โจ่งแจ้ง? อย่างไรก็ตาม ballant เป็นคำภาษาฝรั่งเศสสำหรับ "dangling" ซึ่งอาจเป็นข้อผิดพลาดที่เกี่ยวข้องกับพอยน์เตอร์
hardmath

อ่านตัวอย่างตัววนซ้ำ ... ไม่มีลักษณะการทำงานที่ไม่ได้กำหนด
Dennis Zickefoose

1
คุณประกาศว่า "ซอร์สโค้ดตัวอย่างจำนวนมากที่ให้ใน cplusplus.com นั้นไม่ถูกต้อง" และจากนั้นลบตัวอย่างที่พูดว่า "ตัวอย่างที่ฉันอ้างถึงก่อนหน้านี้ไม่ถูกต้อง" - ทำไมคุณลบตัวอย่างออกแล้ว :)
user2962533

ตามเว็บไซต์นี้กรณีที่คุณอธิบายผลลัพธ์ในประเภทการส่งคืนที่ไม่ได้กำหนดไม่ได้เป็นพฤติกรรมที่ไม่ได้กำหนด en.cppreference.com/w/cpp/string/byte/atoi ; อย่างไรก็ตามดูเหมือนว่า Cplusplus.com จะอัปเดตเอกสารให้ตรงกับสิ่งที่คุณพูด เห็นได้ชัดว่าพวกเขาตอบสนองต่อคำขอของชุมชนเพื่อการแก้ไข อย่างไรก็ตามฉันไม่แน่ใจว่าเว็บไซต์ใดที่ถูกต้องที่สุดเพราะทั้งสองในคำถามระบุสิ่งที่แตกต่างกันมาก
shawn1874

เป็นเวลา 9 ปีแล้วที่คำตอบนี้ถูกโพสต์ โดยทั่วไปแล้วยังเชื่อว่า Cplusplus.com มีข้อมูลที่ไม่ถูกต้องหรือไม่ครบถ้วนจำนวนมากหรือไม่?
Tyler Shellberg

3

เอกสารสำหรับtype_infoพยายามอธิบายtypeidก่อน แต่ล้มเหลว:

Typeid สามารถนำไปใช้โดยตรงกับประเภทซึ่งในกรณีนี้มันจะส่งกลับข้อมูลของมัน หรือไปยังวัตถุซึ่งในกรณีนี้มันจะส่งคืนข้อมูลเกี่ยวกับประเภทของวัตถุ

เมื่อ typeid ถูกนำไปใช้กับตัวชี้การลงทะเบียนกับวัตถุประเภท polymorphic class (คลาสที่ประกาศหรือสืบทอดฟังก์ชันเสมือน) มันจะพิจารณาชนิดไดนามิก (เช่นชนิดของวัตถุที่ได้รับมากที่สุด)

ตอนนี้ย่อหน้าที่สองไม่เห็นด้วยกับวรรคแรก ในtypeid(*ptr), typeidถูกนำไปใช้เพื่อการแสดงออก สิ่งนี้ค่อนข้างสำคัญเนื่องจากความคิดstaticและdynamicประเภทมีความเหมาะสมในบริบทของการแสดงออกไม่ใช่วัตถุ typeid(foo())นอกจากนี้ยังบอลเฉียงกรณีเช่น

นอกจากนี้ย่อหน้าที่สองละเว้นการอ้างอิง พวกเขาก็สามารถมีประเภทคงที่แตกต่างจากชนิดไดนามิกของวัตถุที่อ้างอิง


ดีมาก - คำถาม RTTI เกิดขึ้นกับ SO ด้วยระเบียบที่คาดการณ์ได้ ดีที่จะรู้ว่าสิ่งที่จะไม่อ้างอิง
Kerrek SB

3

เอกสารของstd::pair<T1,T2>::operator==บอกว่าองค์ประกอบทั้งสองมีการทดสอบเพื่อความเท่าเทียมกัน เอกสารของstd::pair<T1,T2>::operator<บอกว่าองค์ประกอบที่สองได้รับการพิจารณาเฉพาะในกรณีที่องค์ประกอบแรกมีค่าเท่ากัน

คำว่า "เท่ากัน" จะปรากฏในทั้งสองกรณี T::operator==แต่เฉพาะในกรณีแรกไม่ได้จริงๆหมายถึง ในกรณีที่สองหมายถึงเท่ากับ!(a.first<b.first || b.first<a.first)


นี่เป็นข้อบังคับหรือเป็นอิสระที่จะใช้ไลบรารี่operator==ในกรณีที่สองหากมีโอเปอเรเตอร์หรือไม่
Kerrek SB

1
จำเป็น c ++ มาตรฐานไม่ผสมและoperator== operator<
MSalters
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.