Cplusplus.com में क्या गलत है?


200

यह शायद इस सवाल के लिए एक बिल्कुल उपयुक्त मंच नहीं है, लेकिन मुझे इसे दूर ले जाने के जोखिम पर एक शॉट दें।

C ++ मानक पुस्तकालय के लिए कई संदर्भ हैं, जिनमें अमूल्य आईएसओ मानक, MSDN , IBM , cppreference और अधिशेष शामिल हैं । व्यक्तिगत रूप से, C ++ लिखते समय मुझे एक संदर्भ की आवश्यकता होती है जिसमें त्वरित यादृच्छिक अभिगम, लघु भार समय और उपयोग के उदाहरण हैं, और मुझे cplusplus.com बहुत उपयोगी लग रहा है। हालाँकि, मैं उस वेबसाइट के बारे में अक्सर एसओ पर नकारात्मक राय सुन रहा हूं, इसलिए मैं विशिष्ट प्राप्त करना चाहूंगा:

Cplusplus.com द्वारा दी गई त्रुटियों, गलत धारणाओं या सलाह के बुरे टुकड़े क्या हैं? कोडिंग निर्णय लेने के लिए इसका उपयोग करने के जोखिम क्या हैं?

मुझे इस बिंदु को जोड़ने दें: मैं मानक के सटीक उद्धरणों के साथ SO पर यहां प्रश्नों का उत्तर देने में सक्षम होना चाहता हूं, और इस प्रकार मैं तुरंत प्रयोग करने योग्य लिंक पोस्ट करना चाहूंगा, और cplusplus.com मेरी पसंद की साइट होगी। इस मुद्दे।


62
क्यों घटता है? यह पूरी तरह से वैध सवाल है। यदि आपको एक संदर्भ की आवश्यकता है, तो आप एक विश्वसनीय स्रोत चाहते हैं। मैंने cplusplus.com के खिलाफ भी शिकायतें सुनीं, जहां मुझे मानक पुस्तकालय के लिए एक त्वरित संदर्भ मिल सकता है और इस तरह, यह दिलचस्प है।
Xeo

48
@ ओलाफुर: मुझे राय नहीं चाहिए, मैं उस साइट पर गलतियों की ठोस सूची चाहता हूं। यदि कोई नहीं है, तो मैं भविष्य की आलोचना को दूर करने के लिए इस प्रश्न का उपयोग करने में सक्षम होना चाहता हूं।
केरेक एसबी

4
@ Óलाफुर वेज: शायद। लेकिन उस वेबसाइट की सामग्री की सटीकता / सत्यता के बारे में पूरी तरह से वस्तुनिष्ठ बिंदु बनाए जा सकते हैं।
डैनियल स्लॉफ

14
हम पहले से ही Google पर "cplusplus.com" के लिए पेज एक पर हैं। यह प्रभावशाली है कि कितनी जल्दी एसओ प्रश्न खोज रैंकिंग पर चढ़ते हैं।
ऑर्बिट

5
मुझे लगता है कि यह उचित है - यह देखते हुए कि यह प्रश्न "cplusplus" के लिए खोजों पर कितना ऊंचा है - ध्यान दें, चूंकि यह प्रश्न पूछा गया था, cplusplus.com के लिए कई सुधार किए गए हैं। वास्तव में, गलतियां बताने वाले शीर्ष तीन उत्तर अब सत्य नहीं हैं।
मार्क एच

जवाबों:


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)में itter अभी भी निष्क्रिय है, लेकिन इसका मतलब यह नहीं है कि वे पुराने मूल्यों को बनाए रखते हैं और अभी भी सुलभ हैं। वे अनिर्दिष्ट हैं।


इसी तरह, गलत जानकारी भी cplusplus.comदेता हैlist::removeयह कहता है ,

ध्यान दें कि एक वैश्विक एल्गोरिथ्म फ़ंक्शन, निकालें, एक समान व्यवहार के साथ मौजूद है लेकिन दो पुनरावृत्तियों के बीच काम कर रहा है।

जो पूरी तरह से गलत है। जैसा कि हमने देखा था कि वैश्विक हटाए जाने के std::removeसमान नहीं है list::remove, क्योंकि हमने देखा कि कंटेनर से आइटम वास्तव में नहीं हटाते हैं क्योंकि यह नहीं हो सकता है , जबकि बाद वाला (सदस्य फ़ंक्शन) वास्तव में आइटम हटा देता है क्योंकि यह कर सकता है

यह उत्तर मेरे अन्य उत्तर से निम्नलिखित विषय में कॉपी किया जाता है, जिसमें थोड़ा संशोधन होता है:

नोट: जब से मैं हाल ही में आया था जब मैं उपरोक्त विषय में उत्तर दे रहा था, मुझे याद है। कई त्रुटियां हैं जो मुझे पिछले दो वर्षों में आई हैं, जो मुझे याद नहीं हैं। अगर मैं फिर से आऊं तो मैं कुछ और जोड़ सकता हूं।


1
+1: इस साइट पर बहुत सारे गलत कथन हैं?
Kलेम

4
@Alexander: list::removeकंटेनर से तत्वों को निकालता है। लेकिन std::removeकंटेनर से तत्वों को नहीं निकालता है। मैं यह नहीं कह सकता कि उनका व्यवहार "समान" है।
नवाज

3
अच्छा पकड़ा! यह उन चीजों का एक बहुत अच्छा उदाहरण है जिनकी मुझे तलाश है।
केरेक एसबी

3
"समान" बहस योग्य है, क्योंकि यह राय का विषय है कि दो अलग-अलग ऑपरेशन समान हैं या नहीं। यह भी बहस योग्य है कि क्या cplusplus.com को दस्तावेज के रूप में प्रच्छन्न राय देनी चाहिए। लेकिन वैसे भी, "अपने पुराने मूल्यों को बनाए रखना" एक अक्षम्य त्रुटि है, यह सिर्फ दिखाता है कि cplusplus विवरण मानक पर आधारित नहीं था।
स्टीव जेसप

5
@Steve: आपने कहा "Similar" is debateable। यदि शब्द similarबहस का मुद्दा है, तो यह बहुत ज्यादा बताता है कि इस शब्द सही शब्द नहीं है और जब से व्यवहार की व्याख्या से बचा जाना चाहिए std::removeऔर list::removeक्योंकि एक, स्पष्टीकरण स्पष्ट किया जाना चाहिए के रूप में संभव के रूप में ज्यादा है, यह एक और स्पष्टीकरण की आवश्यकता नहीं होनी चाहिए।
नवाज

38

मैं इसके विपरीत थोड़ा राय देने जा रहा हूं। Cplusplus.com पर बहुत सारी अच्छी जानकारी है। इसे मौत पर उठाओ, और हाँ, निश्चित रूप से इसकी समस्याएं हैं, लेकिन क्या साइट नहीं है? निश्चित रूप से यह साइट नहीं है । कांच के घरों में रहने वाले लोगों को पत्थर नहीं फेंकने चाहिए। यहाँ बहुत गलत जानकारी है। ऐसे स्वीकार किए गए उत्तर हैं जो फ्लैट-आउट गलत हैं, डाउनवोट किए गए उत्तर (कुछ नकारात्मक!) स्पॉट-ऑन सही हैं।

Cplusplus.com के साथ एक मुद्दा यह है कि यह एक बंद साइट है; वही उल्लेखित अधिकांश अन्य संदर्भ साइटों के लिए जाता है। यह स्टैक ओवरफ्लो जैसी सामुदायिक-विकसित साइट के अनाज के खिलाफ जाता है। भरोसेमंद संपादन करने की क्षमता हासिल करने से वह सब लंबे समय तक नहीं चलता है, और यहां तक ​​कि नवीनतम के नए भी आसानी से सुधार के लिए सुझाव दे सकते हैं। इसकी तुलना cplusplus.com से करें। यदि आप उनके कर्मचारियों पर नहीं हैं तो आप एक स्थायी नौसिखिया हैं। यहां तक ​​कि अगर आप WG21 के प्रमुख सदस्य हैं, तो आपको उनके ईमेल रिपोर्ट तंत्र से गुजरना होगा यदि आप उस साइट पर कहीं बग देखते हैं। अभिशाप!

इस साइट पर एक समाधान हमारे अपने सी + + संदर्भ को विकसित करने के लिए होगा। यह काफी काम का होगा। हमें सावधान रहना होगा कि बहुत अधिक पांडित्य / बहुत तकनीकी न हो; यह स्पष्ट है कि cplusplus.com कम से कम कुछ तकनीकी संपादकों को नियुक्त करता है जो पेड को बे पर रखते हैं। हमें जानकारी को सुव्यवस्थित रखना होगा; यहाँ अक्सर पूछे जाने वाले प्रश्न अच्छी तरह से व्यवस्थित नहीं हैं। हम भी बहुत सावधान रहना होगा मानक से बहुत अधिक सीधे टोंटी नहीं; यह अवैध है।


7
मैं अक्सर पुराने cppreference.com का इस्तेमाल किया करता था, लेकिन अब उन्होंने इसे विकि-ईश में बदल दिया है (क्या यह हर किसी के द्वारा संपादित किया जा सकता है?) ... और मुझे वास्तव में यह और पसंद नहीं है। यह महत्वपूर्ण जानकारी देखने के लिए मुश्किल है, मुझे लगता है। यह सिर्फ cplusplus.com से मुझे मिलने वाले तत्काल संतुष्टि का अभाव है। मुझे लगता है।
केरेक एसबी

14
वाह! मैं ठीक इसके विपरीत देखता हूं। मैंने पुराने cppreference.com को बार-बार बंद कर दिया क्योंकि मुझे इसका पता लगाना मुश्किल और खराब लिखा हुआ लगा। नई cppreference.com एक विज्ञापन-मुक्त, समुदाय-आधारित साइट प्रतीत होती है, जो मेरे अंतिम पैराग्राफ में मेरे द्वारा सुझाई गई है।
डेविड हैमेन

1
शायद यह सिर्फ मैं था, मैं इसे एक और कोशिश दूंगा। मुझे लगता है कि मैं कुछ <thread>या <atomic>सामान देखना चाहता था और बस "कृपया इस पृष्ठ को लिखें" इसलिए मैंने हार मान ली। मुझे फिर से जांच करने दो! ओह, C ++ 0x समर्थन बेशक एक बड़ा बोनस होगा!
केरेक एसबी

10
"कांच के घरों में रहने वाले लोगों को पत्थर नहीं फेंकना चाहिए।" SO दावा नहीं करता है (भाग में) C ++ के लिए एक पुस्तकालय संदर्भ cplusplus.com/reference करता है। जब लोग यहां दावे करते हैं, तो वे उन्हें वापस करने के लिए मानक का हवाला देते हैं, या यदि वे नहीं करते हैं तो कोई और व्यक्ति साथ आता है और अंदर भरता है। यदि वे गलत हैं, तो आप उनके काम को देख सकते हैं। यदि cplusplus.com गलत है, तो आपने सिर्फ एक कोड लिखा है जो लेखक के "उसके तत्वों का विस्तृत विवरण" तैयार करने के अलावा कुछ सी ++ कार्यान्वयन पर विफल होगा। समस्या यह है कि cplusplus.com अनौपचारिक है, लेकिन औपचारिक दिखने के लिए लिखा गया है।
स्टीव जेसप

4
एसओ अनौपचारिक है, और अनौपचारिक दिखने के लिए लिखा गया है। अब, अगर cplusplus.com का उद्देश्य सटीक दस्तावेज / संदर्भ सामग्री होना नहीं है और मैंने एक अस्वीकरण को याद किया है तो काफी हद तक उचित है, किसी भी पत्थर को उन लोगों पर फेंकने के लिए मान लें जो साइट के बजाय इसका उपयोग करते हैं। लेकिन मुद्दा यह है कि सिर्फ इसलिए कि cplusplus.com एक C ++ फ़ंक्शन के बारे में कुछ कहता है, इसका मतलब यह नहीं है कि यह सच है, और यह जानने योग्य है कि यदि आप इसे त्वरित संदर्भ के रूप में उपयोग करने की योजना बनाते हैं। मैं फ़ंक्शन हस्ताक्षर देखने के लिए इसका उपयोग करता हूं, लेकिन कभी भी एक ठीक बिंदु को व्यवस्थित करने के लिए नहीं कि मेरा कोड अनुरूप है या नहीं।
स्टीव जेसप

14

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

यह उल्लेख करने में विफल रहता है कि "यदि नकल उन वस्तुओं के बीच होती है जो ओवरलैप होती हैं, तो व्यवहार अपरिभाषित है।" (C89 मानक में 4.11.2.4। मेरे पास C90 के हाथ की प्रतिलिपि नहीं है, जो कि C ++ 03 वास्तव में संदर्भित करता है, लेकिन वे केवल पृष्ठ क्रमांक जैसे सामान में अंतर करने वाले हैं।)


आह, पुरानी सी लाइब्रेरी ... अच्छा।
केरेक एसबी

6
वे उल्लेख करते हैं destination and source shall not overlap
स्नाइपर

2
@ सिनपर "ओवरलैप नहीं होगा" "व्यवहार अपरिभाषित" के समान नहीं है। आपकी टिप्पणी वास्तव में cplusplus.com की एक सूक्ष्म, व्यापक असफलता पर प्रकाश डालती है - यह सही लगता है, लेकिन यह सही नहीं है।
एंड्रयू हेनले

@ स्नाइपर: मुझे लगता है कि शायद यह नहीं कहा कि जब मैंने 2011 में यह जवाब दिया था। मैंने इनपुट पर पर्याप्त बाधा के रूप में "ओवरलैप नहीं करेगा" लिया होगा।
स्टीव जेसप

9

Cplusplus.com द्वारा दिया गया दस्तावेज अक्सर गलत या अधूरा होता है।

एक बार ऐसा उदाहरण है, atoicplusplus.com पर प्रलेखन।

atoi
इन रिटर्न सेक्शन में, 0 रिटर्न मान के बारे में कोई उल्लेख नहीं है यदि फ़ंक्शन का उपयोग करते समय कोई रूपांतरण नहीं किया जा सकता है।

cplusplus.com रिटर्न सेक्शन में कहा गया है ... "यदि परिवर्तित मान किसी इंटेंस द्वारा प्रतिनिधित्व योग्य मानों की सीमा से बाहर होगा, तो यह अपरिभाषित व्यवहार का कारण बनता है।"

यह सही है, मानक के अनुसार " यदि स्ट्रिंग के संख्यात्मक मान को इंट में दर्शाया नहीं जा सकता है, तो व्यवहार अपरिभाषित है "।

हालाँकि यह खंड पूर्ण नहीं है क्योंकि इसमें 0 का उल्लेख रिटर्न वैल्यू के रूप में नहीं है, जो भ्रामक हो सकता है। वाक्यांश "... कोई रूपांतरण नहीं किया गया है और शून्य लौटाया गया है।" वर्णन पैराग्राफ में पहले मिला है, लेकिन यह रिटर्न सेक्शन में होना आवश्यक है ।

Cplusplus.com पर दिए गए कई सैंपल सोर्स कोड गलत हैं।
इन संदर्भों को देखने वाले कई नवलेखों में बैलेंट त्रुटियों को बनाने के लिए नेतृत्व किया जाता है।

एक उदाहरण का हवाला देते हैं:

संपादित करें: मैंने पहले उल्लेख किया उदाहरण गलत था।


5
शायद बैलेंट -> ज़बरदस्त? हालाँकि बैलेंट "डैंगलिंग" के लिए एक फ्रांसीसी शब्द है, जो पॉइंटर्स से जुड़ी त्रुटियों के लिए एप्रोपोस हो सकता है।
हार्डमैथ

उस पुनरावृत्त उदाहरण को फिर से पढ़ें ... कोई अपरिभाषित व्यवहार नहीं है।
डेनिस ज़िकफ़ोज़

1
आपने घोषणा की "cplusplus.com पर दिए गए कई सैंपल सोर्स कोड गलत हैं।" और फिर उदाहरण को यह कहते हुए हटा दिया कि "मैंने पहले उद्धृत किया उदाहरण गलत था।" - आपने उदाहरण क्यों निकाले? :)
user2962533

इस साइट के अनुसार, आपके द्वारा अपरिभाषित रिटर्न प्रकार में परिणामों का वर्णन अपरिभाषित व्यवहार नहीं है। en.cppreference.com/w/cpp/string/byte/atoi ; हालाँकि, ऐसा लगता है कि Cplusplus.com ने अपने प्रलेखन को अपडेट किया है कि आप क्या कह रहे हैं। जाहिर है वे सुधारों के लिए सामुदायिक अनुरोधों का जवाब देते हैं। फिर भी, मुझे यकीन नहीं है कि कौन सी वेबसाइट सबसे सही है क्योंकि दो प्रश्न बहुत अलग हैं।
shann1874

इस जवाब को पोस्ट किए 9 साल हो चुके हैं। क्या यह अभी भी आम तौर पर माना जाता है कि Cplusplus.com में गलत या अधूरी जानकारी है?
टायलर शेलबर्ग 20

3

दस्तावेज़ के लिए पहले type_infoसमझाने की कोशिश करता है typeid, लेकिन विफल रहता है:

टाइपिड को सीधे प्रकारों पर लागू किया जा सकता है, जिस स्थिति में यह अपनी जानकारी देता है; या वस्तुओं के लिए, जिस स्थिति में यह वस्तु के प्रकार पर जानकारी लौटाता है।

जब टाइपिड को पॉलीमॉर्फिक क्लास टाइप (वर्चुअल फंक्शन घोषित या इनहेरिट करने वाला वर्ग) के ऑब्जेक्ट के लिए एक डिफाइन्ड पॉइंटर पर लागू किया जाता है, तो यह इसके डायनेमिक टाइप (यानी, सबसे व्युत्पन्न ऑब्जेक्ट का प्रकार) पर विचार करता है।

अब दूसरा पैराग्राफ पहले से ही पहले से ही असहमत है। में typeid(*ptr), typeidएक अभिव्यक्ति पर लागू होता है। यह बल्कि आवश्यक है, क्योंकि staticऔर dynamicप्रकार की धारणा केवल अभिव्यक्ति के संदर्भ में समझ में आती है, वस्तुओं के नहीं। यह भी जैसे मामलों को याद करता है typeid(foo())

इसके अलावा, दूसरा पैराग्राफ संदर्भों को छोड़ देता है। वे भी उनके द्वारा संदर्भित वस्तु के गतिशील प्रकार से भिन्न स्थिर प्रकार हो सकते हैं।


बहुत अच्छा - आरटीटीआई प्रश्न एसओ पर पूर्वानुमानित नियमितता के साथ आते हैं। यह जानना अच्छा है कि संदर्भ क्या नहीं है।
केरेक एसबी

3

दस्तावेज़ का std::pair<T1,T2>::operator==कहना है कि दोनों तत्वों को समानता के लिए परीक्षण किया गया है। दस्तावेज का std::pair<T1,T2>::operator<कहना है कि दूसरे तत्वों को केवल तभी माना जाता है जब पहले तत्व समान हों।

दोनों मामलों में "समान" शब्द दिखाई देता है। फिर भी, केवल पहले मामले में इसका वास्तव में मतलब है T::operator==। दूसरे मामले में, समान साधन!(a.first<b.first || b.first<a.first)


क्या यह अनिवार्य है, या operator==यदि ऑपरेटर उपलब्ध है तो पुस्तकालय दूसरे मामले में उपयोग करने के लिए स्वतंत्र है?
केरेक एसबी

1
अनिवार्य। C ++ मानक मिश्रण नहीं करता है operator==और operator<
एमएसलेटर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.