के साथ वर्ष
(पढ़ें: के बाद नहीं लंबे cfront
) सी ++ compilers, संकलक परोक्ष वस्तुओं पर टाइपकास्ट ऑपरेटरों कॉल करने के लिए जब जरूरत इसकी गारंटी नहीं किया गया था। यदि iostream
में operator !
घोषित नहीं किया गया था, तो आप सभी मामलों में काम करने के लिए !cout
की अपेक्षा नहीं कर सके। सी ++ 89 (या जो भी पूर्व-सी ++ 98 मानक कहा जाता था) बस अपरिभाषित क्षेत्र छोड़ दिया।
यही कारण है कि operator void*()
ओवरलोड किया गया था, और operator int
या operator bool
नहीं था। (bool
भी उस बिंदु पर मानक में अपना अलग प्रकार के रूप में मौजूद नहीं था।) मैं अपने प्रोफेसर याद मुझे उस if()
कह, हुड के नीचे, उम्मीद सी ++ में एक void*
, क्योंकि उस प्रकार एक "superset" प्रकार रिश्तेदार के रूप में कार्य कर सकता है उन अभिव्यक्ति परिणाम प्रकार है कि एक if
बयान के लिए पारित किया जाएगा, लेकिन मैं नहीं मिला है इस कहीं से बताया है।
यह जीसीसी 2 के समय था, जब अधिकांश लोग टेम्पलेट्स या अपवादों का समर्थन नहीं करते थे, या यदि उन्होंने किया, तो उन्हें पूरी तरह से समर्थन नहीं मिला, इसलिए टेम्पलेट्स के साथ मेटाप्रोग्रामिंग सी ++ अभी भी एक सैद्धांतिक अभ्यास था और आपने सुनिश्चित किया जांच करने के लिए है कि operator new
एक अशक्त सूचक वापस नहीं आए।
इससे मुझे कई सालों तक पागल हो गया।
स्ट्रॉस्ट्रप के सी ++ प्रोग्रामिंग भाषा, तृतीय संस्करण से एक दिलचस्प अंश। (1997), पृष्ठ 276:
IStream और ostream प्रकार एक रूपांतरण समारोह पर भरोसा करते हैं इस तरह के
while (cin >> x) cout << x;
इनपुट आपरेशन CIN >> एक्स एक रिटर्न के रूप में बयान सक्षम करने के लिए आईएसट्रीम &। वह मान स्पष्ट रूप से cin की स्थिति को इंगित करने वाले मान में परिवर्तित हो गया है। मूल्य का परीक्षण और द्वारा किया जा सकता है। हालांकि, यह आमतौर पर एक प्रकार से दूसरे में एक अंतर्निहित रूपांतरण को परिभाषित करने का एक अच्छा विचार है जिससे रूपांतरण में जानकारी खो जाती है।
सी ++ में बहुत कुछ है जो लगातार सुन्दर या चालाक की जीत प्रतीत होता है। मैं एक बिट कोई फ़र्क नहीं पड़ेगा अगर सी ++ के रूप में ऊपर पाश को संभालने के लिए बहुत चालाक था:
while (!(cin >> x).fail()) cout << x;
इस वजह है, जबकि अधिक वर्बोज़ और अधिक विराम चिह्न, एक शुरुआत प्रोग्रामर के लिए स्पष्ट है।
... असल में, इसके बारे में सोचने के लिए आओ, मुझे इनमें से किसी भी संरचना को पसंद नहीं है। इसे स्पेल करें:
for(;;)
{ cin >> x;
if(!cin)
break;
cout << x;
}
मुझे यह बेहतर क्यों पसंद है? चूंकि यह संस्करण इसे स्पष्ट करता है कि कोड को विस्तारित करने के लिए, कहें, एक के बजाय एक समय में दो रीड को संभालें। उदाहरण के लिए, "मौजूदा कोड फ्लोट वैल्यू का अनुक्रम कॉपी करता है। हम चाहते हैं कि आप इसे बदल दें ताकि यह फ्लोट वैल्यू को जोड़ सके और उन्हें प्रति पंक्ति दो लिखें, क्योंकि अब हम जटिल संख्याओं का उपयोग कर रहे हैं।"
लेकिन मैं digress।
ये 'basic_ios' के सदस्य कार्य हैं, न कि' ios_base'। –
@ मार्सेलो: धन्यवाद, मैंने इसे ठीक किया है। – sbi
@Neil: धन्यवाद, मैं उस बारे में भूल गया। वैसे भी, ऐसा लगता है कि आप या तो नहीं जानते? – sbi