C ++ 11 - हटा दिया गया और हटा दिया गया


हर कोई पहले से ही नए C ++ 11 मानक की रिहाई के बारे में जानता है, हैबर पर इसकी विशेषताओं के बारे में पहले से ही कई लेख थे। लेकिन मैंने इस बारे में लिखने का फैसला किया कि नए संस्करण में सी ++ से क्या बाहर रखा गया था और किन कारणों से। यह नई विशेषताओं जितना महत्वपूर्ण नहीं लग सकता है, लेकिन, जैसा कि वे कहते हैं: "जो इतिहास नहीं जानता है वह गलतियों को दोहराने के लिए बर्बाद है।"

गतिशील अपवाद विनिर्देशों


आप शायद जानते हैं कि फ़ंक्शन की घोषणा करते समय, आप निर्दिष्ट कर सकते हैं कि यह फ़ंक्शन किस प्रकार के अपवाद उत्पन्न करेगा। खैर, कुछ इस तरह से:
int A() throw(); //     int B() throw(A,B); //   A  B int (); //     

और ऐसा लगता है - सब कुछ ठीक है, लेकिन केवल वास्तविकता में:
  1. फंक्शन A किसी भी अपवाद को फेंक सकता है
  2. फंक्शन बी किसी भी अपवाद को फेंक सकता है
  3. समारोह C कुछ भी उत्पन्न नहीं कर सकता है।
कौन परवाह करता है कि ऐसा क्यों है - इस लेख को यहां पढ़ सकते हैं। मैं इस तथ्य के बारे में पहले से ही चुप हूं कि फ़ंक्शन A का वाक्यविन्यास बिल्कुल अचिंत्य है - जब मैंने पहली बार देखा था, तो मैंने फैसला किया कि बस फ़ंक्शन A किसी भी अपवाद को फेंक सकता है, और सी नहीं। इसके अलावा, कुछ कंपाइलर (उदाहरण के लिए, Microsoft Visual C ++) फ़ंक्शन B की शैली में घोषणाओं के बारे में कोई लानत नहीं देते हैं - कोई चेक नहीं किया जाएगा, जिसके बारे में चेतावनी ईमानदारी से चेतावनी देगी।

अब यह सब गड़बड़ हटा दी गई है और एक कीवर्ड "noexcept" जोड़ा गया है, जो बताता है कि फ़ंक्शन अपवादों को नहीं फेंक सकता है। और वह यह है।

auto_ptr


एक प्रकार का स्मार्ट पॉइंटर अब C ++ में मौजूद नहीं है। auto_ptr हटाया गया। Auto_ptr का विचार अच्छा था, लेकिन व्यवहार में यह पता चला कि लोग बिल्कुल प्रलेखन नहीं पढ़ते हैं। और यद्यपि यह स्पष्ट रूप से auto_ptr के खर्च पर कहा गया है कि इसका उपयोग नहीं किया जा सकता है, उदाहरण के लिए, STL संग्रह के साथ, सभी ने लगातार किया। और सबसे बुरी बात यह है कि इससे अस्पष्ट परिणाम हुए। उदाहरण के लिए, इस तरह का एक कोड है:
 vector<auto_ptr<int> > vi; //..populate vi sort(vi.begin(), vi.end(), indirect_less()); 

संकलक, ओएस, एसटीएल संस्करण और चंद्रमा चरण के आधार पर, यह काम कर सकता है, काम नहीं, या यहां तक ​​कि दुर्घटना भी। C ++ मानकीकरण समिति ने मन को प्रसन्न करने के लिए निराशा की और auto_ptr को अनूठे_ptr से बदल दिया, जो auto_ptr के लिए एक समस्या में एक बहुत ही विशिष्ट तरीके से व्यवहार करता है: यह या तो काम करता है या संकलन नहीं करता है। मुझे लगता है कि हर कोई इस बात से सहमत होगा कि यह काफी बेहतर व्यवहार है।

"उत्तराधिकार के बिंदु" की अवधारणा


सवालों के प्रशंसक "मैं कितना + ++ + ++ मैं?" हमेशा कौशल के साथ रुचि के बिंदुओं का पालन करना पसंद करेंगे। पहले, सी ++ मानक निर्धारित करता था कि कौन से ऑपरेशन अनुक्रम बिंदु हैं और जो नहीं हैं। अब इस अवधारणा को समाप्त कर दिया गया है, हालांकि अनिवार्य रूप से कुछ भी नहीं बदला है। सभी ऑपरेशनों को वैसे भी विभाजित किया जाता है जो कुछ कार्यों के अनुक्रम की गारंटी देते हैं और गारंटी नहीं देते हैं। अब वे कहते हैं कि "ऑपरेशन अनुक्रमिक है" या "ऑपरेशन अनुक्रमिक नहीं है।" इस परिवर्तन को नए मेमोरी मॉडल के मानकीकरण को सरल बनाने की कुछ भ्रामक आशाओं द्वारा समझाया गया है (यह सब क्या है?), आदि। यह मुझे लगता है - एक झूठ। यह सिर्फ इतना है कि "निम्न बिंदु" किसी तरह बहुत जटिल लग रहा था। :)

निर्यात टेम्पलेट्स


मुझे लगता है कि बहुत कम लोग इस सुविधा को जानते थे या इसका उपयोग करते थे। यहाँ एक उदाहरण है:
 // File 1: #include <stdio.h> static void trace() { printf("File 1\n"); } // declaration only export template <class T> T const& min(T const&, T const&); int main() { trace(); return min(2, 3); } // File 2: #include <stdio.h> static void trace() { printf("File 2\n"); } //The definition export template <class T> T const& min(T const &a, T const &b) { trace(); return a<b ? a : b; } 

ध्यान दें कि एक फ़ाइल में एक टेम्पलेट फ़ंक्शन घोषित किया गया है, इसे दूसरे में लागू किया गया है, और फाइलें एक दूसरे को शामिल नहीं करती हैं और प्रत्येक के पास ट्रेस () फ़ंक्शन का अपना संस्करण है। इस विषय पर अधिक जानकारी यहाँ मिल सकती है । एडिसन डिजाइन ग्रुप, कई साल पहले, इस सुविधा को मानक में जोड़ने पर जोर देता था। यह उन्हें बहुत महत्वपूर्ण लगा, उन्होंने इसे अपने स्वयं के संकलक में भी लागू किया, हालाँकि, उनके अलावा किसी और ने ऐसा नहीं किया (हालाँकि उनके विकास का उपयोग किया गया था, उदाहरण के लिए, बोरलैंड द्वारा)। समय बीतता गया और ईडीजी ने स्वीकार किया कि वे गलत थे। टेम्पलेट्स का निर्यात C ++ 11 मानक से हटा दिया गया था।

नए मानक को सीखने में सभी को शुभकामनाएं, लेख किसी के लिए उपयोगी हो तो मुझे बहुत खुशी होगी।

Source: https://habr.com/ru/post/In131512/


All Articles