C++14: Difference between revisions

From Vigyanwiki
Line 1: Line 1:
{{C++ language revisions}}
{{C++ language revisions}}
सी[[C++|++]]14, सी++ प्रोग्रामिंग भाषा के मानकीकरण के लिए अंतर्राष्ट्रीय संगठन/अंतर्राष्ट्रीय [[इंटरनेशनल इलेक्ट्रोटेक्नीकल कमीशन]] मानक का संस्करण है। इसका उद्देश्य सी[[C++11|++11]] पर कम विस्तार होना है, जिसमें मुख्य प्रकार से बग फिक्स और छोटे सुधार सम्मिलित हैं, और इसे सी[[C++17|++17]] द्वारा प्रतिस्थापित किया गया था। इसकी स्वीकृति की घोषणा 18 अगस्त 2014 को की गई थी।<ref>{{Citation |title=We have C++14! |first=Herb |last=Sutter |date=August 18, 2014 |url=https://isocpp.org/blog/2014/08/we-have-cpp14 |access-date=2014-08-18}}</ref> सी++14 को दिसंबर 2014 में आईएसओ/आईइसी 14882:2014 के रूप में प्रकाशित किया गया था।<ref>{{Cite web|url=https://www.iso.org/cms/render/live/en/sites/isoorg/contents/data/standard/06/40/64029.html|title=ISO/IEC 14882:2014|website=ISO}}</ref> क्योंकि पहले के सी++ मानक संशोधनों में काफी देर हो चुकी थी, सी++1वाई नाम का उपयोग कभी-कभी इसके अनुमति तक किया जाता था, इसी प्रकार सी++11 मानक को 2010 से पहले इसकी रिलीज की अपेक्षा के साथ सी++ 0एक्स कहा जाता था (चूँकि वास्तव में यह 2010 और अंत में 2011 में स्खलित हो गया)।


== नई भाषा सुविधाएँ ==
=== अल्टरनेट टाइप डिडक्शन पर डिक्लिरिएशन  ===


ये सी ++ 14 की मुख्य भाषा में जोड़े गए विशेषताएँ हैं।
सी++11 में, टाइप डिडक्शन के दो प्रकार जोड़े गए थे। ऑटो दी गई एक्सप्रेशन के आधार पर उपयुक्त प्रकार का वेरिएबल बनाने का युक्ति था। डेसिअलटाइप दी गई एक्सप्रेशन के प्रकार की गणना करने का युक्ति था। चूँकि, डेसिअलटाइप और ऑटो टाइप अलग-अलग प्रकार से निकालते हैं। विशेष प्रकार से, ऑटो निरंतर गैर-संदर्भ प्रकार का अनुमान लगाता है, जैसे कि उपयोग करके एसटीडी::डीके, जबकि ऑटो&& अधिकतर रेफरेन्स निकालता है। चूँकि, डेसिअलटाइप एक्सप्रेशन वैल्यू श्रेणी और एक्सप्रेशन की प्रकृति के आधार पर रेफरेन्स या नॉन-रेफरेन्स टाइप को कम करने के लिए प्रेरित किया जा सकता है:<ref>{{Cite web|url=http://thbecker.net/articles/auto_and_decltype/section_10.html|title = Page 10 of: C++ auto and decltype Explained}}</ref><ref name="wong1">{{cite web|last = Wong|first = Michael|title = The View from the C++ Standard meeting April 2013 Part 1|url = https://www.ibm.com/developerworks/community/blogs/5894415f-be62-4bc0-81c5-3956e82276f3/entry/the_view_from_c_standard_meeting_april_2013_part_1?lang=en|work = C/C++ Cafe|date = 30 April 2013|access-date = 27 January 2016}}</ref>
 
=== फंक्शन रिटर्न टाइप डिडक्शन ===
 
सी++11 ने रिटर्न स्टेटमेंट (कथन) को दिए गए एक्सप्रेशन (अभिव्यक्ति) के प्रकार के आधार पर रिटर्न टाइप को निकालने के लिए [[लैम्ब्डा फ़ंक्शन (कंप्यूटर प्रोग्रामिंग)]] की अनुमति दी है। सी++14 सभी फंक्शन के लिए यह क्षमता प्रदान करता है। यह इन सुविधाओं को लैम्ब्डा फंक्शन तक विस्तारित करता है, जो उन फंक्शन के लिए रिटर्न टाइप  की परिणाम की अनुमति देता है जो रिटर्न एक्सप्रेशन नहीं बनाते हैं। <ref name="wong1">{{cite web|last = Wong|first = Michael|title = The View from the C++ Standard meeting April 2013 Part 1|url = https://www.ibm.com/developerworks/community/blogs/5894415f-be62-4bc0-81c5-3956e82276f3/entry/the_view_from_c_standard_meeting_april_2013_part_1?lang=en|work = C/C++ Cafe|date = 30 April 2013|access-date = 27 January 2016}}</ref> रिटर्न टाइप के परिणाम को प्रेरित करने के लिए, फ़ंक्शन को घोषित ऑटो रिटर्न  टाइप के रूप में घोषित किया जाना चाहिए, परन्तु सी ++ 11 में अनुगामी रिटर्न टाइप विनिर्देशक के बिना है:
 
ऑटो रिटर्न परिणाम के प्रकार (); // रिटर्न टाइप निर्धारित किया जाना है।
 
यदि फंक्शन के कार्यान्वयन में कई रिटर्न एक्सप्रेशन का उपयोग किया जाता है, तो उन सभी को एक ही प्रकार का अनुमान लगाना चाहिए।<ref name=deduce>{{cite web|title=N3638 Return type deduction for normal functions (Revision 5)|url=http://open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3638.html|last=Merrill|first=Jason|date=17 April 2013|access-date=14 June 2013}}</ref> उनके रिटर्न टाइप को निकालने वाले फंक्शन को आगे घोषित किया जा सकता है, परन्तु जब तक उन्हें परिभाषित नहीं किया जाता तब तक उनका उपयोग नहीं किया जा सकता है। उनकी परिभाषाएँ उनका उपयोग करने वाली अनुवाद इकाई के लिए उपलब्ध होनी चाहिए।
 
इस प्रकार के फंक्शन के साथ [[प्रत्यावर्तन]] का उपयोग किया जा सकता है, परन्तु फंक्शन की परिभाषा में कम से कम रिटर्न स्टेटमेंट के बाद पुनरावर्ती कॉल होना चाहिए:<ref name=deduce />
 
ऑटो करेक्ट (आईएनटी आई)
{
  यदि (आई==1)
      रिटर्न आई; // रिटर्न प्रकार आईएनटी के प्रकार में घटाया गया है। 
 
  रिटर्न करेक्ट (आई-1)+आई; // ठीक है इसे अभी कॉल करें
}
 
ऑटो रॉंग आईएनटी आई) {
  यदि (आई! = 1)
    रिटर्न रॉंग (आई-1)+आई; // इसे कॉल करना बहुत तेजी होगा। कोई पूर्व रिटर्न कथन नहीं है।
 
  रिटर्न आई; // रिटर्न टाइप आईएनटी के प्रकार में घटाया गया है। 
}
 
=== घोषणा पर वैकल्पिक प्रकार की कटौती ===
 
सी++11 में, टाइप डिडक्शन के दो प्रकार जोड़े गए थे। ऑटो दी गई एक्सप्रेशन के आधार पर उपयुक्त प्रकार का वेरिएबल बनाने का युक्ति था। डेसिअलटाइप दी गई एक्सप्रेशन के प्रकार की गणना करने का युक्ति था। चूँकि, डेसिअलटाइप और ऑटो टाइप अलग-अलग प्रकार से निकालते हैं। विशेष प्रकार से, ऑटो निरंतर गैर-संदर्भ प्रकार का अनुमान लगाता है, जैसे कि उपयोग करके एसटीडी::डीके, जबकि ऑटो&& अधिकतर संदर्भ प्रकार निकालता है। चूँकि, डेसिअलटाइप एक्सप्रेशन वैल्यू श्रेणी और एक्सप्रेशन की प्रकृति के आधार पर संदर्भ या गैर-संदर्भ प्रकार को कम करने के लिए प्रेरित किया जा सकता है:<ref>{{Cite web|url=http://thbecker.net/articles/auto_and_decltype/section_10.html|title = Page 10 of: C++ auto and decltype Explained}}</ref><ref name=wong1 />


आईएनटी  आई;
आईएनटी  आई;
Line 51: Line 21:
डेसिअलटाइप (एफ())  एक्स5डी=एफ();   // डेसिअलटाइप (एक्स5डी) है आईएनटी       
डेसिअलटाइप (एफ())  एक्स5डी=एफ();   // डेसिअलटाइप (एक्स5डी) है आईएनटी       


सी ++ 14 जोड़ता है डेसिअलटाइप (ऑटो) सिंटैक्स (वाक्य-रचना) है। यह स्वतः घोषणाओं को ऑटो एक्सप्रेशन पर डेसिअलटाइप नियमों का उपयोग करने की अनुमति देता है। डेसिअलटाइप (ऑटो) सिंटैक्स (वाक्य-रचना) का उपयोग फंक्शन रिटर्न टाइप परिणाम के साथ भी किया जा सकता है डेसिअलटाइप (ऑटो) इसके  विपरीत सिंटैक्स (वाक्य-रचना) ऑटो फंक्शन के रिटर्न टाइप की परिणाम के लिए है।<ref name="deduce" />
सी ++ 14 जोड़ता है डेसिअलटाइप (ऑटो) सिंटैक्स (वाक्य-रचना) है। यह स्वतः घोषणाओं को ऑटो एक्सप्रेशन पर डेसिअलटाइप नियमों का उपयोग करने की अनुमति देता है। डेसिअलटाइप (ऑटो) सिंटैक्स (वाक्य-रचना) का उपयोग फंक्शन रिटर्न टाइप परिणाम के साथ भी किया जा सकता है डेसिअलटाइप (ऑटो) इसके  विपरीत सिंटैक्स (वाक्य-रचना) ऑटो फंक्शन के रिटर्न टाइप की परिणाम के लिए है।<ref name="deduce">{{cite web|title=N3638 Return type deduction for normal functions (Revision 5)|url=http://open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3638.html|last=Merrill|first=Jason|date=17 April 2013|access-date=14 June 2013}}</ref>




Line 57: Line 27:
=== रिलैक्स्ड कॉन्स्टेक्स प्रतिबंध ===
=== रिलैक्स्ड कॉन्स्टेक्स प्रतिबंध ===


सी++11 ने कॉन्सटेक्सपर-घोषित फंक्शन की अवधारणा प्रस्तुत की;  फंक्शन जिसे संकलन समय पर निष्पादित किया जा सकता है। उनके रिटर्न वैल्यू को उन ऑपरेशनों द्वारा उपभोग किया जा सकता है जिनके लिए निरंतर एक्सप्रेशन आवश्यकता होती है, जैसे पूर्णांक टेम्पलेट तर्क इत्यादि है। चूँकि, सी++11 कॉन्सटेक्सपर फंक्शन में मात्र एक ही एक्सप्रेशन हो सकता है जो लौटाया जाता है (साथ ही स्टैटिक एसर्ट और अन्य घोषणाओं की छोटी संख्या है)।
सी++11 ने कॉन्सटेक्सपर- डिक्लियर्ड फंक्शन की अवधारणा प्रस्तुत की;  फंक्शन जिसे संकलन समय पर निष्पादित किया जा सकता है। उनके रिटर्न वैल्यू को उन ऑपरेशनों द्वारा उपभोग किया जा सकता है जिनके लिए निरंतर एक्सप्रेशन आवश्यकता होती है, जैसे पूर्णांक टेम्पलेट तर्क इत्यादि है। चूँकि, सी++11 कॉन्सटेक्सपर फंक्शन में मात्र एक ही एक्सप्रेशन हो सकता है जो लौटाया जाता है (साथ ही स्टैटिक एसर्ट और अन्य घोषणाओं की छोटी संख्या है)।


सी++14 इन रेस्ट्रिक्शन्स (प्रतिबंधों) को रिलेक्स्ड करता है। कॉन्सटेक्सपर-घोषित फंक्शन में अब निम्नलिखित सम्मिलित हो सकते हैं:<ref name=wong1/>
सी++14 इन रेस्ट्रिक्शन्स (प्रतिबंधों) को रिलेक्स्ड करता है। कॉन्सटेक्सपर- डिक्लियर्ड फंक्शन में अब निम्नलिखित सम्मिलित हो सकते हैं:<ref name=wong1/>


* को छोड़कर कोई भी घोषणा:
* को छोड़कर कोई भी घोषणा:
Line 66: Line 36:
* यदि सशर्त ब्रांचिंग स्टेटमेंट और स्विच है।
* यदि सशर्त ब्रांचिंग स्टेटमेंट और स्विच है।
* रेंज-आधारित युक्त कोई भी लूपिंग स्टेटमेंट के लिए है ।
* रेंज-आधारित युक्त कोई भी लूपिंग स्टेटमेंट के लिए है ।
* एक्सप्रेशंस जो किसी ऑब्जेक्ट के वैल्यू को बदल देती हैं यदि उस ऑब्जेक्ट का लाइफटाइम (जीवनकाल) कांस्टेंट एक्सप्रेशन फंक्शन के अंतर्गत प्रारम्भ होता है। इसमें किसी भी गैर-स्थिरांक कॉन्सटेक्सपर-डिक्लियर्ड गैर-स्थैतिक मेंबर फंक्शन होता है।
* एक्सप्रेशंस जो किसी ऑब्जेक्ट के वैल्यू को बदल देती हैं यदि उस ऑब्जेक्ट का लाइफटाइम (जीवनकाल) कांस्टेंट एक्सप्रेशन फंक्शन के अंतर्गत प्रारम्भ होता है। इसमें किसी भी नॉन-कॉन्स्ट कॉन्सटेक्सपर-डिक्लियर्ड नॉन-स्टैटिक मेंबर फंक्शन होता है।


गोटो सी ++ 14 रिलैक्स्ड से कॉन्सटेक्सपर-डिक्लियर्ड फंक्शन में स्टेटमेंट प्रतिबंधित हैं।
गोटो सी ++ 14 रिलैक्स्ड से कॉन्सटेक्सपर-डिक्लियर्ड फंक्शन में स्टेटमेंट प्रतिबंधित हैं।


साथ ही, सी ++ 11 ने कहा कि सभी नॉन-स्टैटिक फंक्शन कॉन्स्टैक्सपर भी स्पष्ट प्रकार से डिक्लियर्ड किए गए थे, इस संबंध में भी स्पष्ट प्रकार से डिक्लियर्ड कॉन्स्ट थे | वह तब से हटा दिया गया है; नॉन-स्टैटिक मेंबर फंक्शन नॉन-कॉन्स्ट हो सकते हैं। <ref>{{cite web|title=N3652 Relaxing constraints on constexpr functions|first=Richard|last=Smith|date=18 April 2013|url=http://open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3652.html}}</ref> चूँकि, उपरोक्त प्रतिबंधों के अनुकूल, नॉन-कॉन्स्ट कॉन्स्टैक्सपर मेंबर फंक्शन मात्र एक वर्ग मेंबर को संशोधित कर सकता है यदि उस ऑब्जेक्ट का लाइफटाइम निरंतर एक्सप्रेशन इवैल्यूएशन के अंतर्गत प्रारम्भ हुआ हो।
साथ ही, सी ++ 11 ने कहा कि सभी नॉन-स्टैटिक फंक्शन कॉन्स्टैक्सपर भी स्पष्ट प्रकार से डिक्लियर्ड किए गए थे, इस संबंध में भी स्पष्ट प्रकार से डिक्लियर्ड कॉन्स्ट थे | वह तब से हटा दिया गया है; नॉन-स्टैटिक मेंबर फंक्शन नॉन-कॉन्स्ट हो सकते हैं। <ref>{{cite web|title=N3652 Relaxing constraints on constexpr functions|first=Richard|last=Smith|date=18 April 2013|url=http://open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3652.html}}</ref> चूँकि, उपरोक्त रेस्ट्रिक्शन के अनुकूल, नॉन-कॉन्स्ट कॉन्स्टैक्सपर मेंबर फंक्शन मात्र एक वर्ग मेंबर को संशोधित कर सकता है यदि उस ऑब्जेक्ट का लाइफटाइम निरंतर एक्सप्रेशन इवैल्यूएशन के अंतर्गत प्रारम्भ हुआ हो।


=== वेरिएबल टेम्पलेट्स ===
=== वेरिएबल टेम्पलेट्स ===


सी ++ के पूर्व संस्करणों में, मात्र फंक्शन, क्लासेस या टाइप उपनामों को टेम्पलेट किया जा सकता है। सी++14 टेम्पलेटेड वेरिएबल के निर्माण की अनुमति देता है। प्रस्ताव में दिया गया उदाहरण परिवर्तन है पीआई जिसे विभिन्न प्रकारों के लिए पाई का मान प्राप्त करने के लिए पढ़ा जा सकता है (जैसे, 3 जब एक अभिन्न प्रकार के रूप में पढ़ा जाता है; के साथ संभव निकटतम मूल्य फ्लोट, डबल या लॉन्ग डबल उपयुक्त जब प्रकार में पढ़ने पर डबल या लॉन्ग डबल इत्यादि है)।
सी ++ के पूर्व संस्करणों में, मात्र फंक्शन, क्लासेस या टाइप उपनामों को टेम्पलेट किया जा सकता है। सी++14 टेम्पलेटेड वेरिएबल के निर्माण की अनुमति देता है। प्रस्ताव में दिया गया उदाहरण वेरिएबल है पीआई जिसे विभिन्न प्रकारों के लिए पाई का मान प्राप्त करने के लिए पढ़ा जा सकता है (जैसे, 3 जब एक अभिन्न प्रकार के रूप में पढ़ा जाता है; के साथ संभव निकटतम मूल्य फ्लोट, डबल या लॉन्ग डबल उपयुक्त जब प्रकार में पढ़ने पर डबल या लॉन्ग डबल इत्यादि है)।


विशेषज्ञता सहित ऐसी घोषणाओं और परिभाषाओं पर टेम्प्लेट के सामान्य नियम क्रियान्वित होते हैं।<ref name=isocpp/><ref>{{cite web|title=N3651 Variable Templates (Revision 1)|url=http://open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3651.pdf|last=Dos Reis|first=Gabriel|date=19 April 2013}}</ref>  
विशेषज्ञता सहित ऐसी घोषणाओं और परिभाषाओं पर टेम्प्लेट के सामान्य नियम क्रियान्वित होते हैं।<ref name=isocpp/><ref>{{cite web|title=N3651 Variable Templates (Revision 1)|url=http://open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3651.pdf|last=Dos Reis|first=Gabriel|date=19 April 2013}}</ref>  
Line 88: Line 58:
=== सकल  मेंबर  आरंभीकरण ===
=== सकल  मेंबर  आरंभीकरण ===


सी ++ 11 ने  मेंबर प्रारंभकर्ता जोड़े, यदि कोई निर्माता मेंबर को स्वयं प्रारंभ नहीं करता है तो कक्षा के घेरे में  मेंबर ों पर क्रियान्वित होने वाले अभिव्यक्ति है।  मेंबर  प्रारंभकर्ताओं के साथ किसी भी वर्ग को स्पष्ट प्रकार से बाहर करने के लिए समुच्चय की परिभाषा बदल दी गई थी; इसलिए, उन्हें कुल आरंभीकरण का उपयोग करने की अनुमति नहीं है।
सी ++ 11 ने  मेंबर प्रारंभकर्ता जोड़े, यदि कोई निर्माता मेंबर को स्वयं प्रारंभ नहीं करता है तो कक्षा के घेरे में मेंबर्स पर क्रियान्वित होने वाले अभिव्यक्ति है।  मेंबर  प्रारंभकर्ताओं के साथ किसी भी वर्ग को स्पष्ट प्रकार से बाहर करने के लिए समुच्चय की परिभाषा बदल दी गई थी; इसलिए, उन्हें कुल आरंभीकरण का उपयोग करने की अनुमति नहीं है।


सी++14 इस प्रतिबंध को शिथिल करता है,<ref name=wong1 /> ऐसे प्रकारों पर कुल आरंभीकरण की अनुमति देना है। यदि ब्रेस्ड इनिट सूची उस तर्क के लिए कोई मान प्रदान नहीं करती है, तो  मेंबर  प्रारंभकर्ता इसका ध्यान रखता है।<ref>{{cite web|title=N3653 Member initializers and aggregates|url=http://open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3653.html|date=17 April 2013|first1=Daveed|last1=Vandevoorde|first2=Ville|last2=Voutilainen}}</ref>
सी++14 इस प्रतिबंध को शिथिल करता है,<ref name=wong1 /> ऐसे प्रकारों पर कुल आरंभीकरण की अनुमति देना है। यदि ब्रेस्ड इनिट सूची उस तर्क के लिए कोई मान प्रदान नहीं करती है, तो  मेंबर  प्रारंभकर्ता इसका ध्यान रखता है।<ref>{{cite web|title=N3653 Member initializers and aggregates|url=http://open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3653.html|date=17 April 2013|first1=Daveed|last1=Vandevoorde|first2=Ville|last2=Voutilainen}}</ref>

Revision as of 19:07, 6 March 2023

अल्टरनेट टाइप डिडक्शन पर डिक्लिरिएशन

सी++11 में, टाइप डिडक्शन के दो प्रकार जोड़े गए थे। ऑटो दी गई एक्सप्रेशन के आधार पर उपयुक्त प्रकार का वेरिएबल बनाने का युक्ति था। डेसिअलटाइप दी गई एक्सप्रेशन के प्रकार की गणना करने का युक्ति था। चूँकि, डेसिअलटाइप और ऑटो टाइप अलग-अलग प्रकार से निकालते हैं। विशेष प्रकार से, ऑटो निरंतर गैर-संदर्भ प्रकार का अनुमान लगाता है, जैसे कि उपयोग करके एसटीडी::डीके, जबकि ऑटो&& अधिकतर रेफरेन्स निकालता है। चूँकि, डेसिअलटाइप एक्सप्रेशन वैल्यू श्रेणी और एक्सप्रेशन की प्रकृति के आधार पर रेफरेन्स या नॉन-रेफरेन्स टाइप को कम करने के लिए प्रेरित किया जा सकता है:[1][2]

आईएनटी  आई;

आईएनटी&& एफ ();

ऑटो                        एक्स3ए=आई;       // डेसिअलटाइप (एक्स3ए) है आईएनटी

डेसिअलटाइप (आई)   एक्स3डी=आई;      // डेसिअलटाइप (एक्स3डी) है आईएनटी

ऑटो                        एक्स4ए=(आई);     // डेसिअलटाइप (एक्स4ए)  है आईएनटी

डेसिअलटाइप ((आई)) एक्स4डी=(आई);   // डेसिअलटाइप (एक्स4डी) है आईएनटी  

ऑटो                         एक्स5ए=एफ();     // डेसिअलटाइप (एक्स5ए) है आईएनटी

डेसिअलटाइप (एफ())  एक्स5डी=एफ();   // डेसिअलटाइप (एक्स5डी) है आईएनटी     

सी ++ 14 जोड़ता है डेसिअलटाइप (ऑटो) सिंटैक्स (वाक्य-रचना) है। यह स्वतः घोषणाओं को ऑटो एक्सप्रेशन पर डेसिअलटाइप नियमों का उपयोग करने की अनुमति देता है। डेसिअलटाइप (ऑटो) सिंटैक्स (वाक्य-रचना) का उपयोग फंक्शन रिटर्न टाइप परिणाम के साथ भी किया जा सकता है डेसिअलटाइप (ऑटो) इसके विपरीत सिंटैक्स (वाक्य-रचना) ऑटो फंक्शन के रिटर्न टाइप की परिणाम के लिए है।[3]


रिलैक्स्ड कॉन्स्टेक्स प्रतिबंध

सी++11 ने कॉन्सटेक्सपर- डिक्लियर्ड फंक्शन की अवधारणा प्रस्तुत की; फंक्शन जिसे संकलन समय पर निष्पादित किया जा सकता है। उनके रिटर्न वैल्यू को उन ऑपरेशनों द्वारा उपभोग किया जा सकता है जिनके लिए निरंतर एक्सप्रेशन आवश्यकता होती है, जैसे पूर्णांक टेम्पलेट तर्क इत्यादि है। चूँकि, सी++11 कॉन्सटेक्सपर फंक्शन में मात्र एक ही एक्सप्रेशन हो सकता है जो लौटाया जाता है (साथ ही स्टैटिक एसर्ट और अन्य घोषणाओं की छोटी संख्या है)।

सी++14 इन रेस्ट्रिक्शन्स (प्रतिबंधों) को रिलेक्स्ड करता है। कॉन्सटेक्सपर- डिक्लियर्ड फंक्शन में अब निम्नलिखित सम्मिलित हो सकते हैं:[2]

  • को छोड़कर कोई भी घोषणा:
    • स्टैटिक या थ्रेड लोकल परिणाम है।
    • प्रारंभिक के अतिरिक्त वेरिएबल डेक्लीरियेसंस है।
  • यदि सशर्त ब्रांचिंग स्टेटमेंट और स्विच है।
  • रेंज-आधारित युक्त कोई भी लूपिंग स्टेटमेंट के लिए है ।
  • एक्सप्रेशंस जो किसी ऑब्जेक्ट के वैल्यू को बदल देती हैं यदि उस ऑब्जेक्ट का लाइफटाइम (जीवनकाल) कांस्टेंट एक्सप्रेशन फंक्शन के अंतर्गत प्रारम्भ होता है। इसमें किसी भी नॉन-कॉन्स्ट कॉन्सटेक्सपर-डिक्लियर्ड नॉन-स्टैटिक मेंबर फंक्शन होता है।

गोटो सी ++ 14 रिलैक्स्ड से कॉन्सटेक्सपर-डिक्लियर्ड फंक्शन में स्टेटमेंट प्रतिबंधित हैं।

साथ ही, सी ++ 11 ने कहा कि सभी नॉन-स्टैटिक फंक्शन कॉन्स्टैक्सपर भी स्पष्ट प्रकार से डिक्लियर्ड किए गए थे, इस संबंध में भी स्पष्ट प्रकार से डिक्लियर्ड कॉन्स्ट थे | वह तब से हटा दिया गया है; नॉन-स्टैटिक मेंबर फंक्शन नॉन-कॉन्स्ट हो सकते हैं। [4] चूँकि, उपरोक्त रेस्ट्रिक्शन के अनुकूल, नॉन-कॉन्स्ट कॉन्स्टैक्सपर मेंबर फंक्शन मात्र एक वर्ग मेंबर को संशोधित कर सकता है यदि उस ऑब्जेक्ट का लाइफटाइम निरंतर एक्सप्रेशन इवैल्यूएशन के अंतर्गत प्रारम्भ हुआ हो।

वेरिएबल टेम्पलेट्स

सी ++ के पूर्व संस्करणों में, मात्र फंक्शन, क्लासेस या टाइप उपनामों को टेम्पलेट किया जा सकता है। सी++14 टेम्पलेटेड वेरिएबल के निर्माण की अनुमति देता है। प्रस्ताव में दिया गया उदाहरण वेरिएबल है पीआई जिसे विभिन्न प्रकारों के लिए पाई का मान प्राप्त करने के लिए पढ़ा जा सकता है (जैसे, 3 जब एक अभिन्न प्रकार के रूप में पढ़ा जाता है; के साथ संभव निकटतम मूल्य फ्लोट, डबल या लॉन्ग डबल उपयुक्त जब प्रकार में पढ़ने पर डबल या लॉन्ग डबल इत्यादि है)।

विशेषज्ञता सहित ऐसी घोषणाओं और परिभाषाओं पर टेम्प्लेट के सामान्य नियम क्रियान्वित होते हैं।[5][6]

टेम्पलेट<टाइपनेम टी>

कॉन्स्टैक्सपर टी पाई=टी (3.141592653589793238462643383);

// सामान्य विशेषज्ञता नियम क्रियान्वित होते हैं: टेम्पलेट <>

कॉन्स्टैक्सपर कॉन्स्ट चर* पाई<कॉन्स्ट चर*>="पाई";

सकल मेंबर आरंभीकरण

सी ++ 11 ने मेंबर प्रारंभकर्ता जोड़े, यदि कोई निर्माता मेंबर को स्वयं प्रारंभ नहीं करता है तो कक्षा के घेरे में मेंबर्स पर क्रियान्वित होने वाले अभिव्यक्ति है। मेंबर प्रारंभकर्ताओं के साथ किसी भी वर्ग को स्पष्ट प्रकार से बाहर करने के लिए समुच्चय की परिभाषा बदल दी गई थी; इसलिए, उन्हें कुल आरंभीकरण का उपयोग करने की अनुमति नहीं है।

सी++14 इस प्रतिबंध को शिथिल करता है,[2] ऐसे प्रकारों पर कुल आरंभीकरण की अनुमति देना है। यदि ब्रेस्ड इनिट सूची उस तर्क के लिए कोई मान प्रदान नहीं करती है, तो मेंबर प्रारंभकर्ता इसका ध्यान रखता है।[7]


बाइनरी शाब्दिक

सी ++ 14 में संख्यात्मक अक्षर बाइनरी संख्या में निर्दिष्ट किए जा सकते हैं।[2]सिंटैक्स उपसर्गों θबी या θबी का उपयोग करते हैं। सिंटैक्स का उपयोग अन्य भाषाओं में भी किया जाता है उदाहरण जावा, सी, स्विफ्ट, जाओ, स्काला, रूबी, पायथन, ओसीएएमएल, और कम से कम 2007 से कुछ सी कंपाइलर्स में अनौपचारिक विस्तार के रूप में हुआ है।[8]


अंक विभाजक

सी ++ 14 में, एकल-उद्धरण वर्ण को पूर्णांक शाब्दिक अंकों के विभाजक के रूप में संख्यात्मक शाब्दिक, दोनों पूर्णांक शाब्दिक और फ्लोटिंग स्थान शाब्दिक के रूप में अव्यवस्थित प्रकार से उपयोग किया जा सकता है।[9] यह मानव पाठकों के लिए उपकरना के माध्यम से बड़ी संख्या को पार्स करना सरल बना सकता है।

ऑटो पूर्णांक_लिटरल = 1'000'000;

ऑटो फ्लोटिंग_पॉइंट_लिटरल = 0.000'015'3;

ऑटो बाइनरी_लिटरल = 0b0100'1100'0110;

ऑटो ए_डोज़ेन_करोड़ = 12'00'00'000;

सामान्य लैम्ब्डा

सी ++ 11 में, अज्ञात फंक्शन पैरामीटर को ठोस प्रकारों के साथ घोषित करने की आवश्यकता है। सी ++ 14 इस आवश्यकता को आराम देता है, जिससे लैम्ब्डा क्पै फंक्शन पैरामीटर को ऑटो प्रकार विनिर्देशक के साथ घोषित करने की अनुमति देता है। [5]

ऑटो लैम्ब्डा = [] (ऑटो एक्स, ऑटो वाई) {रिटर्न एक्स + वाई;};

विषय में ऑटो प्रकार की परिणाम, सामान्य लैम्ब्डा टेम्पलेट तर्क परिणाम के नियमों का पालन करते हैं (जो समान हैं, परन्तु सभी कारणों में समान नहीं हैं). उपरोक्त कोड इसके बराबर है:

इस्ट्रक्ट

{

 टेम्पलेट <टाइपनाम टी, टाइपनाम यू>
   ऑटो ऑपरेटर () (टी एक्स, यू वाई) कास्ट {रिटर्न एक्स + वाई;}

} लैम्ब्डा {};

सामान्य लैम्ब्डा अनिवार्य प्रकार से टेम्पलेटेड फ़ैक्टर लैम्ब्डा हैं।

लैम्ब्डा कैप्चर एक्सप्रेशंस

सी++11 लैम्ब्डा फंक्शन मूल्य-कॉपी या संदर्भ द्वारा उनके बाहरी घेरा में घोषित परिवर्तन को कैप्चर करता है। इसका अर्थ है कि लैम्ब्डा के मूल्य मेंबर मात्र-चलने वाले प्रकार नहीं हो सकते हैं।[10] सी ++ 14 अधिकार किए गए मेंबर ों को अव्यवस्थित प्रकार से अभिव्यक्तियों के साथ प्रारंभ करने की अनुमति देता है। यह वैल्यू-मूव द्वारा अधिकार करने और लैम्ब्डा के अव्यवस्थित मेंबर ों को घोषित करने की अनुमति देता है, बाहरी क्षेत्र में समान प्रकार से नामित परिवर्तन के बिना है।[5]

यह प्रारंभिक अभिव्यक्ति के उपयोग के माध्यम से किया जाता है:

ऑटो लैम्ब्डा = [मूल्य = 1] {वापसी मूल्य;};

लैम्ब्डा फंक्शन लैम्ब्डा रिटर्न 1, वह मूल्य जिसके साथ प्रारंभ किया गया था। घोषित अधिकार प्रारंभकर्ता अभिव्यक्ति से प्रकार को कम करता है जैसे कि ऑटो द्वारा किया जाता है।  

यह मानक के उपयोग के माध्यम के चाल से अधिकार करने के लिए उपयोग किया जा सकता है एसटीडी::मूव फंक्शन है:

एसटीडी यूनिक_पीटीआर<आईएनटी>पीटीआर (न्यू इंट(10));

ऑटो लैम्ब्डा = [मूल्य = एसटीडी::मूव (पीटीआर)] {वापसी * ​​मूल्य;};

पदानवत विशेषता इकाई को बहिष्कृत चिन्हित करने की अनुमति देती है, जो इसे अभी भी उपयोग करने के लिए कानूनी बनाती है परन्तु उपयोगकर्ताओं को यह नोटिस देती है कि उपयोग को रोकने का प्रयास किया जाता है और संकलन के दौरान चेतावनी संदेश मुद्रित किया जा सकता है। पदानवत वैकल्पिक स्ट्रिंग शाब्दिक के तर्क के रूप में प्रकट हो सकता है, पदावनति के योग्यता की व्याख्या करने और प्रतिस्थापन का सुझाव देने के लिए होता है।

पदानवत आईएनटी एफ();

पदावनत (जी() थ्रेड-असुरक्षित है। इसके विपरीत एच() का उपयोग करें)

शून्य जी (इंट एंड एक्स);

शून्य एच (इंट एंड एक्स);

शून्य परीक्षण ()

{

 इंट ए = एफ (); // चेतावनी: 'एफ' बहिष्कृत है
 जी (ए); // चेतावनी: 'जी' बहिष्कृत है: जी() थ्रेड-असुरक्षित है। इसके विपरीत एच() का प्रयोग करें

}

नई मानक पुस्तकालय सुविधाएँ

साझा म्यूटेक्स और लॉकिंग

सी ++ 14 साझा समयबद्ध म्यूटेक्स और सहयोगी साझा लॉक प्रकार जोड़ता है।[11][12]


साहचर्य कंटेनरों में विषम लुकअप

सी ++ मानक पुस्तकालय चार सहयोगी कंटेनर वर्गों को परिभाषित करता है। ये वर्ग उपयोगकर्ता को उस प्रकार के मूल्य के आधार पर मूल्य देखने की अनुमति देते हैं। नक्शा कंटेनर उपयोगकर्ता को कुंजी और मान निर्दिष्ट करने की अनुमति देता है, जहां कुंजी द्वारा लुकअप किया जाता है और एक मान देता है। चूँकि, लुकअप निरनतर विशिष्ट कुंजी प्रकार द्वारा किया जाता है, भले ही वह मानचित्र की तरह कुंजी हो या समूह के रूप में स्वयं मान हो।

सी ++ 14 लुकअप को अव्यवस्थित प्रकार के माध्यम से करने की अनुमति देता है, जब तक कि समान ऑपरेटर उस प्रकार की समानता वास्तविक कुंजी प्रकार से कर सकता है।[13] यह मानचित्र की अनुमति देगा एसटीडी::स्ट्रिंग ए के विरुद्ध समान करने के लिए कुछ मूल्य कॉन्स्ट चर* या कोई अन्य प्रकार जिसके लिए ए ऑपरेटर अधिभार उपलब्ध है। यह एक डमी ऑब्जेक्ट बनाने के लिए खोज के उपयोगकर्ता को परेशान किये बिना मेंबर के मूल्य द्वारा एसटीडी::समूह में समग्र वस्तुओं को अनुक्रमणित करने के लिए भी उपयोगी है (उदाहरण के लिए किसी व्यक्ति को नाम से ढूंढने के लिए सम्पूर्ण व्यक्ति की संरचना बनाना)।

पिछली संगतता को बनाए रखने के लिए, विषम लुकअप की अनुमति मात्र तभी दी जाती है जब साहचर्य कंटेनर को दिया गया तुलनित्र इसकी अनुमति देता है। मानक पुस्तकालय कक्षाएं एसटीडी::न्यून<>और एसटीडी::बृहत्तर विषम लुकअप की अनुमति देने के लिए संवर्धित हैं।[14]


मानक उपयोगकर्ता परिभाषित शाब्दिक

सी ++ 11 ने उपयोगकर्ता परिभाषित शाब्दिक प्रत्यय के लिए सिंटैक्स को परिभाषित किया, परन्तु मानक पुस्तकालय ने उनमें से किसी का भी उपयोग नहीं किया गया है। सी ++ 14 निम्नलिखित मानक अक्षर जोड़ता है:[13]

  • एस, विभिन्न बनाने के लिए एसटीडी::बेसिक_स्ट्रिंग प्रकार है।
  • एच, मिनट, एस, एमएस, यूएस, एनएस, संबंधित बनाने के लिए एसटीडी::क्रोनो::अवधी समय अंतराल है।
  • यदि, आई, आईएल, संबंधित बनाने के लिए एसटीडी::काम्प्लेक्स<फ्लोट>, एसटीडी::काम्प्लेक्स<डबल> और एसटीडी::काम्प्लेक्स<लॉन्ग डबल> काल्पनिक संख्या है।

ऑटो स्ट्र = हैलो वर्ल्ड एस; // ऑटो स्ट्रिंग घटाता है

ऑटो ड्यूर = 60s; // ऑटो क्रोनो:: सेकेंड घटाता है

ऑटो जेड = 1i; // ऑटो जटिल <डबल> घटाता है

दो एस शाब्दिक बातचीत नहीं करते हैं, क्योंकि स्ट्रिंग मात्र स्ट्रिंग अक्षर पर चलती है, और सेकेंड के लिए मात्र संख्याओं पर ही चलती है।[15]

टाइप के माध्यम से टपल एड्रेसिंग एसटीडी::टपल में प्रस्तुत प्रकार संकलित-समय स्थिर पूर्णांकों द्वारा टाइप किये गए मानों के कुल योग को अनुक्रमित करने की अनुमति देता है। सी ++ 14 इसे इंडेक्स के विपरीत टाइप द्वारा टपल से लाने की अनुमति देने के लिए विस्तारित करता है।[13]यदि टपल में एक से अत्यधिक प्रकार के तत्व हैं, तो संकलन-समय त्रुटि परिणाम होता है:

टपल <स्ट्रिंग, स्ट्रिंग, इंट> टी (फू, बार, 7);

आईएनटी आई = गेट<आईएनटी>(टी); // मैं == 7

आईएनटी जे = गेट<2>(टी); // पहले जैसा: j == 7

स्ट्रिंग एस = <स्ट्रिंग> (टी) प्राप्त करें; // अस्पष्टता के कारण संकलन-समय त्रुटि है।

छोटी पुस्तकालय सुविधाएँ

एसटीडी::बनाना_अनूठा जैसे प्रयोग कर सकते हैं एसटीडी::बनाना_साझा के लिए एसटीडी::अनूठा_ पिटीआर आब्जेक्ट हैं।[5]

एसटीडी::समाकलित_स्थिर अधिभार निरंतर मान वापस करने के लिए ऑपरेटर प्राप्त किया है।[13]

वर्ग टेम्पले एसटीडी::पूर्णांक_अनुक्रम और संबंधित उपनाम टेम्पलेट संकलन-समय पूर्णांक अनुक्रमों का प्रतिनिधित्व करने के लिए जोड़े गए थे, जैसे पैरामीटर पैक में तत्वों के सूचकांक हैं।[16] वैश्विक एसटीडी::प्रारम्भ/ एसटीडी::अंत फंक्शन को बढ़ाया गया std::cbegin/std::cend कार्य, जो निरंतर पुनरावर्तक लौटाते हैं, और std::rbegin/std::rend और std::crbegin/std::crend जो रिवर्स इटरेटर लौटाते हैं। std::exchange e> फ़ंक्शन टेम्प्लेट एक चर के लिए एक नया मान निर्दिष्ट करता है और पुराना मान लौटाता है।[17] के नए अधिभार std::equal, std::mismatch, और std::is_permutation दूसरी श्रेणी के लिए पुनरावृत्तियों की एक जोड़ी लें, ताकि कॉलर को अलग से यह जांचने की आवश्यकता न हो कि दो श्रेणियां समान लंबाई की हैं।[18]

std::is_final ई> टाइप विशेषता यह पता लगाती है कि कोई वर्ग चिह्नित है या नहीं final. std::quoted ई> स्ट्रीम I/O मैनिपुलेटर आउटपुट पर सीमांकक (दोहरे-उद्धरणों के लिए डिफ़ॉल्ट) रखकर और उन्हें इनपुट पर अलग करके, और किसी भी एम्बेडेड सीमांकक से बचकर, एम्बेडेड रिक्त स्थान के साथ तार डालने और निकालने की अनुमति देता है।[19]


संकलक समर्थन

बजना ने 3.4 में सी++14 के लिए समर्थन समाप्त कर दिया, हालांकि मानक नाम सी++1वाई के तहत, और क्लैंग 6 में सी++14 को डिफ़ॉल्ट सी++ मानक बनाया।[20] GNU कंपाइलर संग्रह ने GCC 5 में सी++14 के लिए समर्थन समाप्त कर दिया, और सी++14 को GCC 6 में डिफ़ॉल्ट सी++ मानक बना दिया।[21] Microsoft Visual Studio 2017 ने लगभग सभी सी++14 सुविधाओं को लागू कर दिया है।[22]


संदर्भ

  1. "Page 10 of: C++ auto and decltype Explained".
  2. 2.0 2.1 2.2 2.3 Wong, Michael (30 April 2013). "The View from the C++ Standard meeting April 2013 Part 1". C/C++ Cafe. Retrieved 27 January 2016.
  3. Merrill, Jason (17 April 2013). "N3638 Return type deduction for normal functions (Revision 5)". Retrieved 14 June 2013.
  4. Smith, Richard (18 April 2013). "N3652 Relaxing constraints on constexpr functions".
  5. 5.0 5.1 5.2 5.3 Sutter, Herb (20 April 2013). "Trip Report: ISO C++ Spring 2013 Meeting". isocpp.org. Retrieved 14 June 2013.
  6. Dos Reis, Gabriel (19 April 2013). "N3651 Variable Templates (Revision 1)" (PDF).
  7. Vandevoorde, Daveed; Voutilainen, Ville (17 April 2013). "N3653 Member initializers and aggregates".
  8. "23479 – Implement binary constants with a "0b" prefix".
  9. Crowl, Lawrence; Smith, Richard; Snyder, Jeff; Vandevoorde, Daveed (25 September 2013). "N3781 Single-Quotation-Mark as a Digit Separator" (PDF).
  10. "Move capture in Lambda". Stack Overflow.
  11. Wong, Michael (30 April 2013). "The View from the C++ Standard meeting April 2013 Part 3". C/C++ Cafe. Retrieved 14 June 2013.
  12. Hinnant, Howard; Vollmann, Detlef; Boehm, Hans (19 April 2013). "N3659 Shared locking in C++ (Revision 2)".
  13. 13.0 13.1 13.2 13.3 Wong, Michael (26 April 2013). "The View from the C++ Standard meeting April 2013 Part 2". C/C++ Cafe. Retrieved 14 June 2013.
  14. "N3657 Adding heterogeneous comparison lookup to associative containers (rev 4)". 19 March 2013.
  15. Sommerlad, Peter (18 April 2013). "N3642 User-defined Literals for Standard Library Types (part 1 - version 4)" (PDF).
  16. Wakely, Jonathan (18 April 2013). "N3658 Compile-time integer sequences". Retrieved 5 January 2016.
  17. Yasskin, Jeffrey (19 April 2013). "N3668 exchange() utility function, revision 3". Retrieved 5 January 2016.
  18. Spertus, Mike; Pall, Attila (19 April 2013). "N3671 Making non-modifying sequence operations more robust: Revision 2". Retrieved 5 January 2016.
  19. Dawes, Beman (19 April 2013). "N3654 Quoted Strings Library Proposal (Revision 2)". Retrieved 5 January 2016.
  20. "C++ Support in Clang". Retrieved 28 May 2016.
  21. "C++ Standards Support in GCC". Retrieved 28 May 2016.
  22. "C++ Standards Conformance from Microsoft". 7 March 2017. Retrieved 7 March 2017.


बाहरी संबंध