C++11: Difference between revisions
From Vigyanwiki
No edit summary |
No edit summary |
||
| Line 2: | Line 2: | ||
{{distinguish|C11 (सी मानक संशोधन)}} | {{distinguish|C11 (सी मानक संशोधन)}} | ||
{{C++ language revisions}} | {{C++ language revisions}} | ||
सी++11, सी++ प्रोग्रामिंग भाषा के लिए मानकीकरण के लिए अंतर्राष्ट्रीय संगठन/अंतर्राष्ट्रीय [[इंटरनेशनल इलेक्ट्रोटेक्नीकल कमीशन]] मानक का संस्करण है। सी++ 11 ने सी++ मानक के पूर्व संस्करण को परिवर्तित कर दिया हैं, जिसे सी++ 03 कहा जाता है,<ref>{{cite web|title=We have an international standard: C++0x is unanimously approved|date=12 August 2011|url=http://herbsutter.com/2011/08/12/we-have-an-international-standard-c0x-is-unanimously-approved/|access-date=12 August 2011|archive-date=11 December 2018|archive-url=https://web.archive.org/web/20181211080242/http://herbsutter.com/2011/08/12/we-have-an-international-standard-c0x-is-unanimously-approved/|url-status=live}}</ref> और इस प्रकार बाद में इसे [[C++14|सी++14]] से परिवर्तित कर दिया हैं । इसका नाम विनिर्देन के प्रकाशन वर्ष के अनुसार भाषा संस्करणों के नामकरण की परंपरा का पालन करता है, चूंकि इसे पूर्व में सी++0एक्स नाम दिया गया था क्योंकि यह 2010 से पहले प्रकाशित होने का आशय था।<ref>{{cite web|last1=Stroustrup|first1=Bjarne|title=C++11 FAQ|url=http://www.stroustrup.com/C++11FAQ.html|website=stroustrup.com|access-date=2014-10-15|archive-date=2018-10-06|archive-url=https://web.archive.org/web/20181006014513/http://www.stroustrup.com/C++11FAQ.html|url-status=live}}</ref> | |||
यद्यपि डिज़ाइन लक्ष्यों में से एक मुख्य भाषा में परिवर्तनों पर लाइब्रेरी में परिवर्तनों को प्राथमिकता देना था,<ref>{{cite web|title=C++11 Overview: What specific design goals guided the committee?|url=https://isocpp.org/wiki/faq/cpp11#cpp11-specific-goals|website=Standard C++|access-date=2015-09-04|archive-date=2019-01-31|archive-url=https://web.archive.org/web/20190131050050/https://isocpp.org/wiki/faq/cpp11#cpp11-specific-goals|url-status=live}}</ref> इसलिए | यद्यपि डिज़ाइन लक्ष्यों में से एक मुख्य भाषा में परिवर्तनों पर लाइब्रेरी में परिवर्तनों को प्राथमिकता देना था,<ref>{{cite web|title=C++11 Overview: What specific design goals guided the committee?|url=https://isocpp.org/wiki/faq/cpp11#cpp11-specific-goals|website=Standard C++|access-date=2015-09-04|archive-date=2019-01-31|archive-url=https://web.archive.org/web/20190131050050/https://isocpp.org/wiki/faq/cpp11#cpp11-specific-goals|url-status=live}}</ref> इसलिए सी++ 11 मूल भाषा में कई परिवर्तन करता है। कोर लैंग्वेज के जिन क्षेत्रों में अधिकतम सुधार हुआ हैं इस प्रकार उनमें मल्टीथ्रेडिंग सपोर्ट, [[सामान्य प्रोग्रामिंग]] सपोर्ट, यूनिफॉर्म इनिशियलाइज़ेशन और परफॉर्मेंस सम्मिलित हैं। गणितीय विशेष फंक्शन्स के लाइब्रेरी को छोड़कर, सी++ मानक लाइब्रेरी में भी महत्वपूर्ण परिवर्तन किए गए थे, जिसमें अधिकांश सी++ तकनीकी रिपोर्ट 1 (टीआर1) [[पुस्तकालय (कंप्यूटर विज्ञान)|लाइब्रेरी (कंप्यूटर विज्ञान)]] सम्मिलित थे।<ref>{{cite web|title=Bjarne Stroustrup: A C++0x overview|url=https://www.research.ibm.com/arl/seminar/media/stroustrup.pdf|access-date=30 June 2011|archive-date=17 June 2016|archive-url=https://web.archive.org/web/20160617024131/https://www.research.ibm.com/arl/seminar/media/stroustrup.pdf|url-status=live}}</ref> | ||
सी++11 को ISO/IEC 14882:2011 के रूप में प्रकाशित किया गया था,<ref>{{cite web | title = ISO/IEC 14882:2011 | publisher = ISO | date = 2 September 2011 | url = http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=50372 | access-date = 3 September 2011 | archive-date = 29 January 2013 | archive-url = https://web.archive.org/web/20130129110331/http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=50372 | url-status = live }}</ref> इस प्रकार सितंबर 2011 में और शुल्क के लिए उपलब्ध है। प्रकाशित सी++11 मानक के समान फंक्शन करने वाला प्रारूप N3337 है, जो दिनांक 16 जनवरी 2012 में बनकर तैयार किया गया था,<ref>{{cite web | title=Working Draft, Standard for Programming Language C++ | url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf | access-date=2012-04-26 | archive-date=2019-01-21 | archive-url=https://web.archive.org/web/20190121141340/http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf | url-status=live }}</ref> इसमें सी++11 मानक से केवल संपादकीय सुधार हुए हैं।<ref>{{cite web | title =The Standard | url =http://isocpp.org/std/the-standard | access-date =2012-11-02 | archive-date =2019-05-13 | archive-url =https://web.archive.org/web/20190513104847/https://isocpp.org/std/the-standard | url-status =live }}</ref> | |||
== डिजाइन लक्ष्य == | == डिजाइन लक्ष्य == | ||
डिज़ाइन समिति ने | डिज़ाइन समिति ने सी++11 को डिज़ाइन करने में कई लक्ष्यों पर टिके रहने का प्रयास किया: | ||
* ISO/IEC 14882| | * ISO/IEC 14882|सी++98 और संभवतः C (प्रोग्रामिंग भाषा) के साथ स्थिरता और अनुकूलता बनाए रखें | ||
* मूल भाषा का विस्तार करने के अतिरिक्त मानक लाइब्रेरी के माध्यम से नई सुविधाओं को प्रस्तुत करना पसंद करें | * मूल भाषा का विस्तार करने के अतिरिक्त मानक लाइब्रेरी के माध्यम से नई सुविधाओं को प्रस्तुत करना पसंद करें | ||
* उन परिवर्तनों को प्राथमिकता दें जो प्रोग्रामिंग तकनीक को विकसित कर सकें | * उन परिवर्तनों को प्राथमिकता दें जो प्रोग्रामिंग तकनीक को विकसित कर सकें | ||
* केवल विशिष्ट अनुप्रयोगों के लिए उपयोगी नई सुविधाओं को प्रस्तुत करने के अतिरिक्त सिस्टम और लाइब्रेरी डिज़ाइन को सुविधाजनक बनाने के लिए | * केवल विशिष्ट अनुप्रयोगों के लिए उपयोगी नई सुविधाओं को प्रस्तुत करने के अतिरिक्त सिस्टम और लाइब्रेरी डिज़ाइन को सुविधाजनक बनाने के लिए सी++ में सुधार करें | ||
* पहले की असुरक्षित तकनीकों के सुरक्षित विकल्प प्रदान करके प्रकार की सुरक्षा बढ़ाएँ | * पहले की असुरक्षित तकनीकों के सुरक्षित विकल्प प्रदान करके प्रकार की सुरक्षा बढ़ाएँ | ||
* प्रदर्शन और सीधे हार्डवेयर के साथ फंक्शन करने की क्षमता बढ़ाएँ | * प्रदर्शन और सीधे हार्डवेयर के साथ फंक्शन करने की क्षमता बढ़ाएँ | ||
| Line 21: | Line 21: | ||
प्रारंभिक समय में लोगों पर ध्यान देना महत्वपूर्ण माना जाता है, क्योंकि अधिकांश कंप्यूटर प्रोग्रामर सदैव ऐसे ही होते हैं, और क्योंकि कई प्रारंभिक अपने ज्ञान को कभी भी विस्तृत नहीं करते हैं, स्वयं को उस भाषा के पहलुओं में फंक्शन करने के लिए सीमित करते हैं जिसमें वे विशेषज्ञ होते हैं।{{Ref|web-strou-brief}} | प्रारंभिक समय में लोगों पर ध्यान देना महत्वपूर्ण माना जाता है, क्योंकि अधिकांश कंप्यूटर प्रोग्रामर सदैव ऐसे ही होते हैं, और क्योंकि कई प्रारंभिक अपने ज्ञान को कभी भी विस्तृत नहीं करते हैं, स्वयं को उस भाषा के पहलुओं में फंक्शन करने के लिए सीमित करते हैं जिसमें वे विशेषज्ञ होते हैं।{{Ref|web-strou-brief}} | ||
== | == सी++ कोर भाषा के लिए एक्सटेंशन == | ||
सी++ समिति का एक फंक्शन भाषा कोर का विकास है। कोर लैंग्वेज के जिन क्षेत्रों में ज्यादा सुधार हुआ उनमें थ्रेड (कंप्यूटर साइंस) सपोर्ट, जेनेरिक प्रोग्रामिंग सपोर्ट, यूनिफॉर्म इनिशियलाइज़ेशन और परफॉर्मेंस सम्मिलित हैं। | |||
=== कोर लैंग्वेज रनटाइम परफॉरमेंस एन्हांसमेंट === | === कोर लैंग्वेज रनटाइम परफॉरमेंस एन्हांसमेंट === | ||
ये भाषा सुविधाएँ मुख्य रूप से स्मृति या कम्प्यूटेशनल गति के किसी प्रकार के प्रदर्शन लाभ प्रदान करने के लिए सम्मिलित हैं। | ये भाषा सुविधाएँ मुख्य रूप से स्मृति या कम्प्यूटेशनल गति के किसी प्रकार के प्रदर्शन लाभ प्रदान करने के लिए सम्मिलित हैं। | ||
==== आर वैल्यू रेफरेंस और मूव कंस्ट्रक्टर्स ==== | ==== आर वैल्यू रेफरेंस और मूव कंस्ट्रक्टर्स ==== | ||
C ++ 03 (और पहले) में, अस्थायी मान (कंप्यूटर विज्ञान) कहा जाता है, क्योंकि वे अधिकांशतः असाइनमेंट के दाहिने तरफ असत्य बोलते हैं) का उद्देश्य कभी भी परिवर्तनीय नहीं होना चाहिए - जैसा कि सी में - और इन्हें अलग-अलग माना जाता है, इस प्रकार इससे <code>const T&</code> प्रकार की कुछ स्थितियों में, टेम्परेरी मानक को संशोधित किया जा सकता था, यह ऐसा व्यवहार हैं जिसे किसी उपयोगी सुरक्षा का मार्ग भी माना जाता था।<ref name="Sutter_Alexandrescu">सटर, अलेक्जेंड्रेस्कु C++ कोडिंग मानक #15</ref> | C ++ 03 (और पहले) में, अस्थायी मान (कंप्यूटर विज्ञान) कहा जाता है, क्योंकि वे अधिकांशतः असाइनमेंट के दाहिने तरफ असत्य बोलते हैं) का उद्देश्य कभी भी परिवर्तनीय नहीं होना चाहिए - जैसा कि सी में - और इन्हें अलग-अलग माना जाता है, इस प्रकार इससे <code>const T&</code> प्रकार की कुछ स्थितियों में, टेम्परेरी मानक को संशोधित किया जा सकता था, यह ऐसा व्यवहार हैं जिसे किसी उपयोगी सुरक्षा का मार्ग भी माना जाता था।<ref name="Sutter_Alexandrescu">सटर, अलेक्जेंड्रेस्कु C++ कोडिंग मानक #15</ref> सी++11 ऐसा नया गैर-कॉन्स्ट संदर्भ प्रकार (सी++) जोड़ता है जिसे a कहा जाता है। इस प्रकार {{visible anchor|आर के प्रतिद्वंद्विता संदर्भ}} द्वारा <code>T&&</code> को पहचाना गया तथा इस प्रकार यह उन अस्थायी वस्तुओं को संदर्भित करता है जिन्हें चलाने वाले शब्दार्थों की अनुमति देने के उद्देश्य से आरंभिक होने के बाद संशोधित करने की अनुमति दी जाती है। | ||
इस प्रकार सी ++ 03 के साथ ऐसी पुरानी प्रदर्शन करने वाली समस्या के लिए महंगी हैं और अनावश्यक [[गहरी प्रति|डीप लैंग्वेज]] है जो वस्तुओं को मूल्य से पारित होने पर अंतर्निहित रूप से हो सकती है। इस मुद्दे को स्पष्ट करने के लिए, विचार करें कि a <code>std::vector<T></code> आंतरिक रूप से, परिभाषित आकार के साथ सी-शैली सरणी के चारों ओर आवरण करती हैं। इस प्रकार यदि <code>std::vector<T></code> अस्थायी बनाया जाता है या किसी फ़ंक्शन से लौटाया जाता है, इसे केवल एक नया बनाकर संग्रहीत किया जा सकता है, इस प्रकार <code>std::vector<T></code> और इस प्रकार इसमें सभी आर वैल्यू के डेटा को कॉपी करना आवश्यक होता हैं। इस स्थिति में अस्थायी और उसकी सभी स्मृतियों को यह नष्ट कर देती हैं। (सरलता के लिए, यह वैरियेबल्चा [[वापसी मूल्य अनुकूलन]] की उपेक्षा करती है।) | इस प्रकार सी ++ 03 के साथ ऐसी पुरानी प्रदर्शन करने वाली समस्या के लिए महंगी हैं और अनावश्यक [[गहरी प्रति|डीप लैंग्वेज]] है जो वस्तुओं को मूल्य से पारित होने पर अंतर्निहित रूप से हो सकती है। इस मुद्दे को स्पष्ट करने के लिए, विचार करें कि a <code>std::vector<T></code> आंतरिक रूप से, परिभाषित आकार के साथ सी-शैली सरणी के चारों ओर आवरण करती हैं। इस प्रकार यदि <code>std::vector<T></code> अस्थायी बनाया जाता है या किसी फ़ंक्शन से लौटाया जाता है, इसे केवल एक नया बनाकर संग्रहीत किया जा सकता है, इस प्रकार <code>std::vector<T></code> और इस प्रकार इसमें सभी आर वैल्यू के डेटा को कॉपी करना आवश्यक होता हैं। इस स्थिति में अस्थायी और उसकी सभी स्मृतियों को यह नष्ट कर देती हैं। (सरलता के लिए, यह वैरियेबल्चा [[वापसी मूल्य अनुकूलन]] की उपेक्षा करती है।) | ||
सी++11 में, ab:More सी++ आइडम्स/मूव कंस्ट्रक्टर या {{visible anchor|मूव कंस्ट्रक्टर}} का प्रारूप <code>std::vector<T></code> हैं। जो इसके लिए प्रतिद्वंद्विता संदर्भ लेता है इस प्रकार <code>std::vector<T></code> किसी नई आरवैल्यू से आंतरिक सी-शैली सरणी में पॉइंटर को कॉपी कर सकते हैं, इसके बाद <code>std::vector<T></code> पुनः पॉइंटर को आर वैल्यू के अंदर शून्य पर सेट करते हैं। चूंकि अस्थायी रूप से ये उपयोग नहीं किया जाएगा, कोई भी कोड अशक्त सूचक तक पहुंचने का प्रयास नहीं करेगा, और क्योंकि सूचक शून्य है, जब यह सीमा से बाहर हो जाता है तो इस प्रकार इसकी मेमोरी को हटाया नहीं जाता है। इसलिए, ऑपरेशन न केवल एक गहरी प्रतिलिपि की कीमत चुकाता है, बल्कि सुरक्षित और अदृश्य रहता है। | |||
इस प्रकार मानक लाइब्रेरी के बाहर किसी प्रकार का परिवर्तन करने की आवश्यकता के अतिरिक्त आर वैल्यू संदर्भ वर्तमान समय में कोड के प्रदर्शन द्वारा होने वाले लाभ को प्रदान कर सकता हैं। इस प्रकार लौटाने वाले फ़ंक्शन के दिए गए मान का प्रकार <code>std::vector<T></code> अस्थायी को स्पष्ट रूप से परिवर्तन करने की आवश्यकता नहीं है। इस प्रकार <code>std::vector<T> &&</code> मूव कंस्ट्रक्टर को काॅल करने के लिए किया जाता हैं, क्योंकि अस्थायी रूप से स्वचालित रूप से प्रतिद्वंद्विता माना जाता है। (चूंकि, यदि <code>std::vector<T></code> किसी सी ++ 03 संस्करण है जिसमें चालक कन्स्ट्रक्टर नहीं है, तो इस प्रकार कॉपी कन्स्ट्रक्टर को साथ में काॅल करता है, इस प्रकार <code>const std::vector<T>&</code> ऐसी महत्वपूर्ण मेमोरी को आवंटन के कारण उत्पन्न होती हैं।) | इस प्रकार मानक लाइब्रेरी के बाहर किसी प्रकार का परिवर्तन करने की आवश्यकता के अतिरिक्त आर वैल्यू संदर्भ वर्तमान समय में कोड के प्रदर्शन द्वारा होने वाले लाभ को प्रदान कर सकता हैं। इस प्रकार लौटाने वाले फ़ंक्शन के दिए गए मान का प्रकार <code>std::vector<T></code> अस्थायी को स्पष्ट रूप से परिवर्तन करने की आवश्यकता नहीं है। इस प्रकार <code>std::vector<T> &&</code> मूव कंस्ट्रक्टर को काॅल करने के लिए किया जाता हैं, क्योंकि अस्थायी रूप से स्वचालित रूप से प्रतिद्वंद्विता माना जाता है। (चूंकि, यदि <code>std::vector<T></code> किसी सी ++ 03 संस्करण है जिसमें चालक कन्स्ट्रक्टर नहीं है, तो इस प्रकार कॉपी कन्स्ट्रक्टर को साथ में काॅल करता है, इस प्रकार <code>const std::vector<T>&</code> ऐसी महत्वपूर्ण मेमोरी को आवंटन के कारण उत्पन्न होती हैं।) | ||
| Line 37: | Line 37: | ||
इस प्रकार सुरक्षा कारणों से कुछ प्रतिबंध लगाए गए हैं। इस प्रकार नामांकित वैरियेबल को कभी भी प्रतिद्वंद्विता नहीं माना जाएगा, भले ही इसे इस प्रकार घोषित किया गया हो। इस प्रकार प्रतिद्वंद्विता प्राप्त करने के लिए, फ़ंक्शन Template <code>std::move()</code> उपयोग किया जाना चाहिए। आर वैल्यू संदर्भों को केवल कुछ परिस्थितियों में ही संशोधित किया जा सकता है, इस प्रकार जिसका मुख्य रूप से मूव कंस्ट्रक्टर के साथ उपयोग करने का प्रमाण है। | इस प्रकार सुरक्षा कारणों से कुछ प्रतिबंध लगाए गए हैं। इस प्रकार नामांकित वैरियेबल को कभी भी प्रतिद्वंद्विता नहीं माना जाएगा, भले ही इसे इस प्रकार घोषित किया गया हो। इस प्रकार प्रतिद्वंद्विता प्राप्त करने के लिए, फ़ंक्शन Template <code>std::move()</code> उपयोग किया जाना चाहिए। आर वैल्यू संदर्भों को केवल कुछ परिस्थितियों में ही संशोधित किया जा सकता है, इस प्रकार जिसका मुख्य रूप से मूव कंस्ट्रक्टर के साथ उपयोग करने का प्रमाण है। | ||
आर वैल्यू संदर्भों के शब्दों की प्रकृति के कारण, और लैवल्यू संदर्भों (नियमित संदर्भों) के शब्दों में कुछ संशोधन के कारण, आर वैल्यू संदर्भ डेवलपर्स को सही फ़ंक्शन अग्रेषण प्रदान करने की अनुमति देते हैं। जब वैरिएडिक टेम्पलेट्स के साथ संयोजित करता है, तो इस प्रकार यह क्षमता फ़ंक्शन टेम्पलेट्स के लिए अनुमति देती है जो तर्कों को किसी अन्य फ़ंक्शन पर पूर्ण रूप से अग्रेषित करता हैं जो उन विशेष तर्कों को लेता है। इस प्रकार यह कन्स्ट्रक्टर पैरामीटर को अग्रेषित करने के लिए सबसे उपयोगी है, इस प्रकार फैक्ट्री फ़ंक्शंस बनाने के लिए जो स्वचालित रूप से उन विशेष तर्कों के लिए सही कन्स्ट्रक्टर को कॉल करता हैं। इसे [http://en.cppreference.com/w/cpp/container/vector/emplace_back emplace_back] | आर वैल्यू संदर्भों के शब्दों की प्रकृति के कारण, और लैवल्यू संदर्भों (नियमित संदर्भों) के शब्दों में कुछ संशोधन के कारण, आर वैल्यू संदर्भ डेवलपर्स को सही फ़ंक्शन अग्रेषण प्रदान करने की अनुमति देते हैं। जब वैरिएडिक टेम्पलेट्स के साथ संयोजित करता है, तो इस प्रकार यह क्षमता फ़ंक्शन टेम्पलेट्स के लिए अनुमति देती है जो तर्कों को किसी अन्य फ़ंक्शन पर पूर्ण रूप से अग्रेषित करता हैं जो उन विशेष तर्कों को लेता है। इस प्रकार यह कन्स्ट्रक्टर पैरामीटर को अग्रेषित करने के लिए सबसे उपयोगी है, इस प्रकार फैक्ट्री फ़ंक्शंस बनाने के लिए जो स्वचालित रूप से उन विशेष तर्कों के लिए सही कन्स्ट्रक्टर को कॉल करता हैं। इसे [http://en.cppreference.com/w/cpp/container/vector/emplace_back emplace_back] सी++ मानक लाइब्रेरी विधियों के सेट में देखा जा सकता है। | ||
====constexpr - सामान्यीकृत स्थिर भाव ==== | ====constexpr - सामान्यीकृत स्थिर भाव ==== | ||
सी ++ में सदैव निरंतर अभिव्यक्ति की अवधारणा होती है। ये ऐसे भाव हैं जो <code>3+4</code> जैसे स्टेटमेंट के लिए संकलन समय और रन टाइम पर सदैव एक ही परिणाम देते हैं। इस प्रकार निरंतर अभिव्यक्तियाँ संकलक के लिए अनुकूलन के अवसर प्रदान करती हैं, और संकलक अधिकांशतः [[संकलन-समय फ़ंक्शन निष्पादन]] और फंक्शनक्रम में परिणामों को हार्डकोड करते हैं। इस प्रकार कई स्थानों पर, | सी ++ में सदैव निरंतर अभिव्यक्ति की अवधारणा होती है। ये ऐसे भाव हैं जो <code>3+4</code> जैसे स्टेटमेंट के लिए संकलन समय और रन टाइम पर सदैव एक ही परिणाम देते हैं। इस प्रकार निरंतर अभिव्यक्तियाँ संकलक के लिए अनुकूलन के अवसर प्रदान करती हैं, और संकलक अधिकांशतः [[संकलन-समय फ़ंक्शन निष्पादन]] और फंक्शनक्रम में परिणामों को हार्डकोड करते हैं। इस प्रकार कई स्थानों पर, सी++ विनिर्देशन के लिए निरंतर व्यंजकों का उपयोग करने की आवश्यकता होती है। इस प्रकार की सरणी को परिभाषित करने के लिए निरंतर अभिव्यक्ति की आवश्यकता होती है, और गणनाकर्ता मान निरंतर अभिव्यक्ति होना चाहिए। | ||
चूंकि निरंतर अभिव्यक्ति को फ़ंक्शन कॉल या ऑब्जेक्ट कन्स्ट्रक्टर रखने की अनुमति नहीं दी गई है। तो कोड का एक भाग जितना सरल है उतना ही अमान्य भी होता है:<blockquote>int get_five() {return 5;} | चूंकि निरंतर अभिव्यक्ति को फ़ंक्शन कॉल या ऑब्जेक्ट कन्स्ट्रक्टर रखने की अनुमति नहीं दी गई है। तो कोड का एक भाग जितना सरल है उतना ही अमान्य भी होता है:<blockquote>int get_five() {return 5;} | ||
int some_value[get_five() + 7]; // Create an array of 12 integers. Ill-formed | int some_value[get_five() + 7]; // Create an array of 12 integers. Ill-formed सी++</blockquote>यह सी ++ 03 में मान्य नहीं था, क्योंकि <code>get_five() + 7</code> स्थिर अभिव्यक्ति नहीं है। सी ++ 03 कंपाइलर के पास यह जानने का कोई तरीका नहीं है कि क्या <code>get_five()</code> वास्तव में रनटाइम पर स्थिर है। सैद्धांतिक रूप में यह फ़ंक्शन वैश्विक वैरिएबल को प्रभावित करता हैं, तथा अन्य गैर-रनटाइम स्थिर फंक्शन्स आदि को कॉल कर सकते हैं। | ||
सी++11 ने <code>constexpr</code> कीवर्ड प्रस्तुत किया, जो इस प्रकार उपयोगकर्ता को यह गारंटी देने की अनुमति देता है कि कोई फ़ंक्शन या ऑब्जेक्ट कंस्ट्रक्टर संकलन-समय स्थिरांक है।<ref>{{cite web|url=http://www.stroustrup.com/sac10-constexpr.pdf|title=General Constant Expressions for System Programming Languages, Proceedings SAC '10|author1=Gabriel Dos Reis|author2=Bjarne Stroustrup|date=22 March 2010|access-date=18 August 2012|archive-date=13 June 2018|archive-url=https://web.archive.org/web/20180613125602/http://www.stroustrup.com/sac10-constexpr.pdf|url-status=live}}</ref> उपरोक्त उदाहरण को निम्नानुसार फिर से लिखा जा सकता है:<blockquote>constexpr int get_five() {return 5;} | |||
int some_value[get_five() + 7]; // Create an array of 12 integers. Valid | int some_value[get_five() + 7]; // Create an array of 12 integers. Valid सी++11</blockquote>यह संकलक को समझने और सत्यापित करने की अनुमति देता है कि <code>get_five()</code> संकलन-समय स्थिरांक है। | ||
<code>constexpr</code> का उपयोग करते हुए किसी फ़ंक्शन पर कुछ सीमाएं लगाई जाती हैं कि वह फ़ंक्शन क्या कर सकता है। इस प्रकार सबसे पहले फ़ंक्शन में गैर-शून्य रिटर्न प्रकार होना चाहिए। दूसरा फ़ंक्शन बॉडी वैरियेबल घोषित नहीं कर सकती है या नए प्रकारों को परिभाषित नहीं कर सकती है। तीसरा, भौतिक में केवल घोषणाएँ, अशक्त कथन और एकल वापसी कथन हो सकते हैं। ऐसे तर्क मान सम्मिलित होने चाहिए, जो तर्क प्रतिस्थापन के पश्चात, रिटर्न स्टेटमेंट में अभिव्यक्ति एक निरंतर अभिव्यक्ति उत्पन्न करते हैं। | <code>constexpr</code> का उपयोग करते हुए किसी फ़ंक्शन पर कुछ सीमाएं लगाई जाती हैं कि वह फ़ंक्शन क्या कर सकता है। इस प्रकार सबसे पहले फ़ंक्शन में गैर-शून्य रिटर्न प्रकार होना चाहिए। दूसरा फ़ंक्शन बॉडी वैरियेबल घोषित नहीं कर सकती है या नए प्रकारों को परिभाषित नहीं कर सकती है। तीसरा, भौतिक में केवल घोषणाएँ, अशक्त कथन और एकल वापसी कथन हो सकते हैं। ऐसे तर्क मान सम्मिलित होने चाहिए, जो तर्क प्रतिस्थापन के पश्चात, रिटर्न स्टेटमेंट में अभिव्यक्ति एक निरंतर अभिव्यक्ति उत्पन्न करते हैं। | ||
सी++11 से पहले, वेरिएबल्स के मानों को निरंतर एक्सप्रेशंस में उपयोग किया जा सकता है, इस प्रकार यदि वेरिएबल्स को कॉन्स घोषित किया जाता है, इस प्रकार इनिशियलाइज़र का उपयोग भी होता हैं जिसके लिए कॉन्स्टेंट एक्सप्रेशन होता है, और यह इंटीग्रल या एन्यूमरेशन टाइप का होता है। सी ++ 11 प्रतिबंध को हटा देता है कि वेरिएबल्स अभिन्न या गणना प्रकार के होने चाहिए यदि उन्हें परिभाषित किया गया है, <code>constexpr</code> कीवर्ड:<blockquote>constexpr double earth_gravitational_acceleration = 9.8; | |||
constexpr double moon_gravitational_acceleration = earth_gravitational_acceleration / 6.0;</blockquote>इस प्रकार के डेटा वेरिएबल्स निहित रूप से होते हैं, और इनकों इनिशियलाइज़र होना चाहिए जिसके लिए निरंतर अभिव्यक्ति का उपयोग होना चाहिए। | constexpr double moon_gravitational_acceleration = earth_gravitational_acceleration / 6.0;</blockquote>इस प्रकार के डेटा वेरिएबल्स निहित रूप से होते हैं, और इनकों इनिशियलाइज़र होना चाहिए जिसके लिए निरंतर अभिव्यक्ति का उपयोग होना चाहिए। | ||
| Line 65: | Line 65: | ||
==== पुराने डेटा की परिभाषा में होने वाले सरल संशोधन ==== | ==== पुराने डेटा की परिभाषा में होने वाले सरल संशोधन ==== | ||
सी ++ 03 में, किसी वर्ग या संरचना को सरल पुराने डेटा (पीओडी) के प्रकार के रूप में माने जाने के लिए कई नियमों का पालन करना चाहिए। इस परिभाषा में फिट होने वाले प्रकार सी के साथ संगत ऑब्जेक्ट लेआउट उत्पन्न करते हैं, और उन्हें स्थिर रूप से प्रारंभ भी किया जा सकता है। इस प्रकार | सी ++ 03 में, किसी वर्ग या संरचना को सरल पुराने डेटा (पीओडी) के प्रकार के रूप में माने जाने के लिए कई नियमों का पालन करना चाहिए। इस परिभाषा में फिट होने वाले प्रकार सी के साथ संगत ऑब्जेक्ट लेआउट उत्पन्न करते हैं, और उन्हें स्थिर रूप से प्रारंभ भी किया जा सकता है। इस प्रकार सी++ 03 मानक में प्रतिबंध है कि कौन से प्रकार C के साथ संगत हैं या कोई तकनीकी कारण नहीं होने के अतिरिक्त स्थिर रूप से आरंभ किया जा सकता है, इस प्रकार किसी संकलक प्रोग्राम को स्वीकार नहीं किया जा सकता हैं, इस प्रकार यदि किसी को सी++03 POD प्रकार बनाना था और इसमें गैर-वर्चुअल सदस्य फ़ंक्शन संयोजित था, तो यह प्रकार अब POD प्रकार नहीं होगा, स्थिर रूप से आरंभ नहीं किया जा सकता है, और मेमोरी लेआउट में कोई परिवर्तन नहीं होने के अतिरिक्त C के साथ असंगत होगा। | ||
सी ++ 11 ने पीओडी अवधारणा को दो अलग-अलग अवधारणाओं तुच्छ और मानक-लेआउट में विभाजित करके कई पीओडी नियमों को आराम दिया गया हैं। | सी ++ 11 ने पीओडी अवधारणा को दो अलग-अलग अवधारणाओं तुच्छ और मानक-लेआउट में विभाजित करके कई पीओडी नियमों को आराम दिया गया हैं। | ||
| Line 96: | Line 96: | ||
==== बाहरी टेम्पलेट ==== | ==== बाहरी टेम्पलेट ==== | ||
सी ++ 03 में, जब भी अनुवाद इकाई में पूर्ण रूप से निर्दिष्ट टेम्पलेट का सामना करना पड़ता है तो संकलक को टेम्पलेट को तुरंत चालू करना चाहिए। इस प्रकार यदि टेम्पलेट को कई अनुवाद इकाइयों में कई प्रकारों के साथ तत्काल किया जाता है, तो यह नाटकीय रूप से संकलन समय बढ़ा सकता है। | सी ++ 03 में, जब भी अनुवाद इकाई में पूर्ण रूप से निर्दिष्ट टेम्पलेट का सामना करना पड़ता है तो संकलक को टेम्पलेट को तुरंत चालू करना चाहिए। इस प्रकार यदि टेम्पलेट को कई अनुवाद इकाइयों में कई प्रकारों के साथ तत्काल किया जाता है, तो यह नाटकीय रूप से संकलन समय बढ़ा सकता है। सी++ 03 में इसे रोकने का कोई तरीका नहीं है, इसलिए सी++11 ने बाहरी डेटा घोषणाओं के अनुरूप बाहरी टेम्पलेट घोषणाएं प्रस्तुत कीं जाती हैं। | ||
सी ++ 03 में यह वाक्यविन्यास है कि संकलक को टेम्पलेट को तुरंत चालू करने के लिए बाध्य किया जाए: | सी ++ 03 में यह वाक्यविन्यास है कि संकलक को टेम्पलेट को तुरंत चालू करने के लिए बाध्य किया जाए: | ||
| Line 102: | Line 102: | ||
template class std::vector<MyClass>; | template class std::vector<MyClass>; | ||
सी++11 अब यह सिंटैक्स प्रदान करता है: | |||
extern template class std::vector<MyClass>; | extern template class std::vector<MyClass>; | ||
| Line 128: | Line 128: | ||
Object anArray[] = <nowiki>{{13.4f, 3}, {43.28f, 29}, {5.934f, 17}}</nowiki>; //An array of three Objects</blockquote>यह स्थैतिक सूचियों के लिए बहुत उपयोगी है, या किसी संरचना को कुछ मूल्य के लिए आरंभ करना है। सी ++ किसी ऑब्जेक्ट को प्रारंभ करने के लिए कन्स्ट्रक्टर भी प्रदान करता है, लेकिन वे अधिकांशतः प्रारंभिक सूची के रूप में सुविधाजनक नहीं होते हैं। चूंकि इस प्रकार सी ++ 03 प्रारंभिक-सूचियों को केवल उन संरचनाओं और class पर अनुमति देता है जो सरल पुराने डेटा (पीओडी) परिभाषा के अनुरूप हैं; सी ++ 11 प्रारंभकर्ता-सूचियों को बढ़ाता है, इसलिए इन्हें मानक कंटेनर समेत सभी वर्गों के लिए <code>std::vector</code> का उपयोग किया जा सकता है। | Object anArray[] = <nowiki>{{13.4f, 3}, {43.28f, 29}, {5.934f, 17}}</nowiki>; //An array of three Objects</blockquote>यह स्थैतिक सूचियों के लिए बहुत उपयोगी है, या किसी संरचना को कुछ मूल्य के लिए आरंभ करना है। सी ++ किसी ऑब्जेक्ट को प्रारंभ करने के लिए कन्स्ट्रक्टर भी प्रदान करता है, लेकिन वे अधिकांशतः प्रारंभिक सूची के रूप में सुविधाजनक नहीं होते हैं। चूंकि इस प्रकार सी ++ 03 प्रारंभिक-सूचियों को केवल उन संरचनाओं और class पर अनुमति देता है जो सरल पुराने डेटा (पीओडी) परिभाषा के अनुरूप हैं; सी ++ 11 प्रारंभकर्ता-सूचियों को बढ़ाता है, इसलिए इन्हें मानक कंटेनर समेत सभी वर्गों के लिए <code>std::vector</code> का उपयोग किया जा सकता है। | ||
सी++11 अवधारणा को टेम्प्लेट से बांधता है, जिसे <code>std::initializer_list</code> कहा जाता है। यह कंस्ट्रक्टर्स और अन्य फ़ंक्शंस को इनिशियलाइज़र सूचियों को पैरामीटर के रूप में लेने की अनुमति देता है। उदाहरण के लिए: | |||
class SequenceClass | class SequenceClass | ||
{ | { | ||
| Line 137: | Line 137: | ||
यह अनुमति देता है इस प्रकार <code>SequenceClass</code> पूर्णांकों के अनुक्रम से निर्मित होता हैं, जैसे:<blockquote>SequenceClass some_var = {1, 4, 5, 6};</blockquote>यह कंस्ट्रक्टर विशेष प्रकार का कंस्ट्रक्टर है, जिसे इनिशियलाइज़र लिस्ट कन्स्ट्रक्टर कहा जाता है। ऐसे कन्स्ट्रक्टर वाले वर्गों को विशेष रूप से युनिफार्म लोकेटर के समय माना जाता है। | यह अनुमति देता है इस प्रकार <code>SequenceClass</code> पूर्णांकों के अनुक्रम से निर्मित होता हैं, जैसे:<blockquote>SequenceClass some_var = {1, 4, 5, 6};</blockquote>यह कंस्ट्रक्टर विशेष प्रकार का कंस्ट्रक्टर है, जिसे इनिशियलाइज़र लिस्ट कन्स्ट्रक्टर कहा जाता है। ऐसे कन्स्ट्रक्टर वाले वर्गों को विशेष रूप से युनिफार्म लोकेटर के समय माना जाता है। | ||
टेम्पलेट वर्ग <code>std::initializer_list<></code> [[प्रथम श्रेणी का नागरिक]] है | इस प्रकार प्रथम श्रेणी का | टेम्पलेट वर्ग <code>std::initializer_list<></code> [[प्रथम श्रेणी का नागरिक]] है | इस प्रकार प्रथम श्रेणी का सी++11 मानक लाइब्रेरी प्रकार। वे सी++11 कंपाइलर के उपयोग के माध्यम से स्थिर रूप से निर्मित किए जा सकते हैं, <code>{}</code> ऐसे संदर्भों में एक प्रकार के नाम के बिना सिंटैक्स जहां ऐसे ब्रेसिज़ a को घटाता हैं। इस प्रकार <code>std::initializer_list</code>, या जैसे प्रकार को स्पष्ट रूप से निर्दिष्ट करके <code>std::initializer_list<SomeType>{args}</code> (और इसी प्रकार डवलेपमेंट सिंटैक्स के अन्य भागों में उपयोग किया जाता हैं)। | ||
सूची को एक बार बनाने के पश्चात कॉपी किया जा सकता है, जो सरल होता है और कॉपी करने के उपरांत इसके रूप में फंक्शन का उपयोग करता हैं। (वर्ग सामान्यतः प्रारंभ/अंत पॉइंटर्स की एक जोड़ी के रूप में फंक्शनान्वित किया जाता है)। इस प्रकार <code>std::initializer_list</code> स्थिर है, इस प्रकार इसके सदस्यों को बनाया जाने के पश्चात परिवर्तित नहीं किया जा सकता है, और न ही उन सदस्यों में डेटा परिवर्तित किया जा सकता है (जो उनसे आगे बढ़ने से नियम बनाते हैं, इस प्रकार class के सदस्यों में प्रतियों की आवश्यकता होती है जिनका उपयोग किया जाता हैं)। | सूची को एक बार बनाने के पश्चात कॉपी किया जा सकता है, जो सरल होता है और कॉपी करने के उपरांत इसके रूप में फंक्शन का उपयोग करता हैं। (वर्ग सामान्यतः प्रारंभ/अंत पॉइंटर्स की एक जोड़ी के रूप में फंक्शनान्वित किया जाता है)। इस प्रकार <code>std::initializer_list</code> स्थिर है, इस प्रकार इसके सदस्यों को बनाया जाने के पश्चात परिवर्तित नहीं किया जा सकता है, और न ही उन सदस्यों में डेटा परिवर्तित किया जा सकता है (जो उनसे आगे बढ़ने से नियम बनाते हैं, इस प्रकार class के सदस्यों में प्रतियों की आवश्यकता होती है जिनका उपयोग किया जाता हैं)। | ||
| Line 154: | Line 154: | ||
सी ++ 03 में प्रारंभिक प्रकारों के साथ कई समस्याएं रहती हैं। इस प्रकार ऐसा करने के कई तरीके सम्मिलित रहते हैं, और कुछ परस्पर विनिमय करने पर अलग अलग परिणाम देते हैं। उदाहरण के लिए, पारंपरिक कन्स्ट्रक्टर सिंटैक्स, फ़ंक्शन घोषणा की तरह दिख सकता है, और इस प्रकार यह सुनिश्चित करने के लिए कुछ कदम उठाए जाने चाहिए जैसे इस प्रकार के संकलक का उपयोग सबसे अधिक रूप से पार्स नियम के द्वारा किया जाता हैं। जो कि इस प्रकार की गलतियाँ नहीं करेगा। इस प्रकार यह केवल समुच्चय और POD प्रकारों को कुल प्रारंभकर्ताओं के साथ प्रारंभ किया जा सकता है (जिसका उपयोग <code>SomeType var = {/*stuff*/};</code> के लिए किया जाता हैं।) | सी ++ 03 में प्रारंभिक प्रकारों के साथ कई समस्याएं रहती हैं। इस प्रकार ऐसा करने के कई तरीके सम्मिलित रहते हैं, और कुछ परस्पर विनिमय करने पर अलग अलग परिणाम देते हैं। उदाहरण के लिए, पारंपरिक कन्स्ट्रक्टर सिंटैक्स, फ़ंक्शन घोषणा की तरह दिख सकता है, और इस प्रकार यह सुनिश्चित करने के लिए कुछ कदम उठाए जाने चाहिए जैसे इस प्रकार के संकलक का उपयोग सबसे अधिक रूप से पार्स नियम के द्वारा किया जाता हैं। जो कि इस प्रकार की गलतियाँ नहीं करेगा। इस प्रकार यह केवल समुच्चय और POD प्रकारों को कुल प्रारंभकर्ताओं के साथ प्रारंभ किया जा सकता है (जिसका उपयोग <code>SomeType var = {/*stuff*/};</code> के लिए किया जाता हैं।) | ||
सी++11 एक सिंटैक्स प्रदान करता है जो किसी भी वस्तु पर फंक्शन करने वाले पूर्ण रूप से समान प्रकार के इनिशियलाइज़ेशन की अनुमति देता है। यह प्रारंभकर्ता सूची सिंटैक्स पर प्रसारित होता है: | |||
struct BasicStruct | struct BasicStruct | ||
| Line 237: | Line 237: | ||
==== लूप के लिए रेंज आधारित ==== | ==== लूप के लिए रेंज आधारित ==== | ||
<code>for</code> | <code>for</code> सी++11 के सिंटैक्स का विस्तार करता है, तथा तत्वों की इस श्रृंखला पर सरल पुनरावृत्ति की अनुमति देने के लिए कथन का उपयोग किया जाता हैं जो इस प्रकार हैं:<blockquote>int my_array[5] = {1, 2, 3, 4, 5}; | ||