C++14: Difference between revisions

From Vigyanwiki
(Created page with "{{C++ language revisions}} C++14, C++ प्रोग्रामिंग भाषा के लिए मानकीकरण के लिए अंतर्राष...")
 
No edit summary
Line 1: Line 1:
{{C++ language revisions}}
{{C++ language revisions}}
[[C++]]14, C++ प्रोग्रामिंग भाषा के लिए मानकीकरण के लिए अंतर्राष्ट्रीय संगठन/अंतर्राष्ट्रीय [[इंटरनेशनल इलेक्ट्रोटेक्नीकल कमीशन]] मानक का एक संस्करण है। इसका उद्देश्य [[C++11]] पर एक छोटा [[तानाना]] होना है, जिसमें मुख्य रूप से बग फिक्स और छोटे सुधार शामिल हैं, और इसे [[C++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> C++14 को दिसंबर 2014 में ISO/IEC 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>
सी[[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 में स्खलित हो गया)।
क्योंकि पहले के C++ मानक संशोधनों में काफी देर हो चुकी थी, C++1y नाम का उपयोग कभी-कभी इसके अनुमोदन तक किया जाता था, इसी तरह C++11 मानक को 2010 से पहले इसकी रिलीज की उम्मीद के साथ C++ 0x कहा जाता था (हालांकि वास्तव में यह 2010 और अंत में 2011 में फिसल गया)।


== नई भाषा सुविधाएँ ==
== नई भाषा सुविधाएँ ==
Line 9: Line 8:
=== फंक्शन रिटर्न टाइप डिडक्शन ===
=== फंक्शन रिटर्न टाइप डिडक्शन ===


C++11 ने रिटर्न स्टेटमेंट को दिए गए एक्सप्रेशन के प्रकार के आधार पर रिटर्न प्रकार को निकालने के लिए [[लैम्ब्डा फ़ंक्शन (कंप्यूटर प्रोग्रामिंग)]] की अनुमति दी। C++14 सभी कार्यों के लिए यह क्षमता प्रदान करता है। यह इन सुविधाओं को लैम्ब्डा कार्यों तक विस्तारित करता है, जो उन कार्यों के लिए रिटर्न प्रकार की कटौती की अनुमति देता है जो फॉर्म के नहीं हैं <code>return expression;</code>.<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 सभी कार्यों के लिए यह क्षमता प्रदान करता है। यह इन सुविधाओं को लैम्ब्डा कार्यों तक विस्तारित करता है, जो उन कार्यों के लिए रिटर्न प्रकार की कटौती की अनुमति देता है जो फॉर्म के नहीं हैं <code>return expression;</code>.<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>
रिटर्न टाइप डिडक्शन को प्रेरित करने के लिए, फ़ंक्शन को घोषित किया जाना चाहिए <code>auto</code> वापसी प्रकार के रूप में, लेकिन सी ++ 11 में अनुगामी रिटर्न प्रकार विनिर्देशक के बिना:
रिटर्न टाइप डिडक्शन को प्रेरित करने के लिए, फ़ंक्शन को घोषित किया जाना चाहिए <code>auto</code> वापसी प्रकार के रूप में, लेकिन सी ++ 11 में अनुगामी रिटर्न प्रकार विनिर्देशक के बिना:


Line 41: Line 40:
=== घोषणा पर वैकल्पिक प्रकार की कटौती ===
=== घोषणा पर वैकल्पिक प्रकार की कटौती ===


C++11 में, टाइप डिडक्शन के दो तरीके जोड़े गए थे। <code>auto</code> दी गई अभिव्यक्ति के आधार पर उपयुक्त प्रकार का एक चर बनाने का एक तरीका था। <code>decltype</code> दी गई अभिव्यक्ति के प्रकार की गणना करने का एक तरीका था। हालाँकि, <code>decltype</code> और <code>auto</code> प्रकार अलग-अलग प्रकार से निकालते हैं। विशेष रूप से, <code>auto</code> हमेशा एक गैर-संदर्भ प्रकार का अनुमान लगाता है, जैसे कि उपयोग करके <code>std::decay</code>, जबकि <code>auto&&</code> हमेशा एक संदर्भ प्रकार निकालता है। हालाँकि, <code>decltype</code> अभिव्यक्ति की मूल्य श्रेणी और अभिव्यक्ति की प्रकृति के आधार पर एक संदर्भ या गैर-संदर्भ प्रकार को कम करने के लिए प्रेरित किया जा सकता है:<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 />
सी++11 में, टाइप डिडक्शन के दो तरीके जोड़े गए थे। <code>auto</code> दी गई अभिव्यक्ति के आधार पर उपयुक्त प्रकार का एक चर बनाने का एक तरीका था। <code>decltype</code> दी गई अभिव्यक्ति के प्रकार की गणना करने का एक तरीका था। हालाँकि, <code>decltype</code> और <code>auto</code> प्रकार अलग-अलग प्रकार से निकालते हैं। विशेष रूप से, <code>auto</code> हमेशा एक गैर-संदर्भ प्रकार का अनुमान लगाता है, जैसे कि उपयोग करके <code>std::decay</code>, जबकि <code>auto&&</code> हमेशा एक संदर्भ प्रकार निकालता है। हालाँकि, <code>decltype</code> अभिव्यक्ति की मूल्य श्रेणी और अभिव्यक्ति की प्रकृति के आधार पर एक संदर्भ या गैर-संदर्भ प्रकार को कम करने के लिए प्रेरित किया जा सकता है:<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 59: Line 58:
=== रिलैक्स्ड कॉन्स्टेक्स प्रतिबंध ===
=== रिलैक्स्ड कॉन्स्टेक्स प्रतिबंध ===


C++11 ने constexpr-घोषित फ़ंक्शन की अवधारणा पेश की; एक फ़ंक्शन जिसे संकलन समय पर निष्पादित किया जा सकता है। उनके वापसी मूल्यों को उन ऑपरेशनों द्वारा उपभोग किया जा सकता है जिनके लिए निरंतर अभिव्यक्ति की आवश्यकता होती है, जैसे पूर्णांक टेम्पलेट तर्क। हालाँकि, C++11 constexpr फ़ंक्शंस में केवल एक ही एक्सप्रेशन हो सकता है जो लौटाया जाता है (साथ ही <code>static_assert</code>s और अन्य घोषणाओं की एक छोटी संख्या)।
सी++11 ने constexpr-घोषित फ़ंक्शन की अवधारणा पेश की; एक फ़ंक्शन जिसे संकलन समय पर निष्पादित किया जा सकता है। उनके वापसी मूल्यों को उन ऑपरेशनों द्वारा उपभोग किया जा सकता है जिनके लिए निरंतर अभिव्यक्ति की आवश्यकता होती है, जैसे पूर्णांक टेम्पलेट तर्क। हालाँकि, सी++11 constexpr फ़ंक्शंस में केवल एक ही एक्सप्रेशन हो सकता है जो लौटाया जाता है (साथ ही <code>static_assert</code>s और अन्य घोषणाओं की एक छोटी संख्या)।


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


* को छोड़कर कोई भी घोषणा:
* को छोड़कर कोई भी घोषणा:
Line 76: Line 75:
=== चर टेम्पलेट्स ===
=== चर टेम्पलेट्स ===


सी ++ के पूर्व संस्करणों में, केवल फ़ंक्शंस, क्लासेस या टाइप उपनामों को टेम्पलेट किया जा सकता है। C++14 टेम्पलेटेड वेरिएबल्स के निर्माण की अनुमति देता है। प्रस्ताव में दिया गया एक उदाहरण एक चर है <code>pi</code> जिसे विभिन्न प्रकारों के लिए पाई का मान प्राप्त करने के लिए पढ़ा जा सकता है (जैसे, <code>3</code> जब एक अभिन्न प्रकार के रूप में पढ़ा जाता है; के साथ संभव निकटतम मूल्य <code>float</code>, <code>double</code> या <code>long double</code> सटीक जब के रूप में पढ़ा <code>float</code>, <code>double</code> या <code>long double</code>, क्रमश; वगैरह।)।
सी ++ के पूर्व संस्करणों में, केवल फ़ंक्शंस, क्लासेस या टाइप उपनामों को टेम्पलेट किया जा सकता है। सी++14 टेम्पलेटेड वेरिएबल्स के निर्माण की अनुमति देता है। प्रस्ताव में दिया गया एक उदाहरण एक चर है <code>pi</code> जिसे विभिन्न प्रकारों के लिए पाई का मान प्राप्त करने के लिए पढ़ा जा सकता है (जैसे, <code>3</code> जब एक अभिन्न प्रकार के रूप में पढ़ा जाता है; के साथ संभव निकटतम मूल्य <code>float</code>, <code>double</code> या <code>long double</code> सटीक जब के रूप में पढ़ा <code>float</code>, <code>double</code> या <code>long double</code>, क्रमश; वगैरह।)।


विशेषज्ञता सहित ऐसी घोषणाओं और परिभाषाओं पर टेम्प्लेट के सामान्य नियम लागू होते हैं।<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 92: Line 91:
सी ++ 11 ने सदस्य प्रारंभकर्ता जोड़े, यदि कोई निर्माता सदस्य को स्वयं प्रारंभ नहीं करता है तो कक्षा के दायरे में सदस्यों पर लागू होने वाले भाव। सदस्य प्रारंभकर्ताओं के साथ किसी भी वर्ग को स्पष्ट रूप से बाहर करने के लिए समुच्चय की परिभाषा बदल दी गई थी; इसलिए, उन्हें कुल आरंभीकरण का उपयोग करने की अनुमति नहीं है।
सी ++ 11 ने सदस्य प्रारंभकर्ता जोड़े, यदि कोई निर्माता सदस्य को स्वयं प्रारंभ नहीं करता है तो कक्षा के दायरे में सदस्यों पर लागू होने वाले भाव। सदस्य प्रारंभकर्ताओं के साथ किसी भी वर्ग को स्पष्ट रूप से बाहर करने के लिए समुच्चय की परिभाषा बदल दी गई थी; इसलिए, उन्हें कुल आरंभीकरण का उपयोग करने की अनुमति नहीं है।


C++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>




Line 131: Line 130:
=== लैम्ब्डा कैप्चर एक्सप्रेशंस ===
=== लैम्ब्डा कैप्चर एक्सप्रेशंस ===


C++11 लैम्ब्डा फ़ंक्शंस मूल्य-कॉपी या संदर्भ द्वारा उनके बाहरी दायरे में घोषित चर को कैप्चर करता है। इसका मतलब है कि लैम्ब्डा के मूल्य सदस्य केवल-चलने वाले प्रकार नहीं हो सकते हैं।<ref>{{cite web|title=Move capture in Lambda|url=https://stackoverflow.com/questions/8640393/move-capture-in-lambda|website=[[Stack Overflow (website)|Stack Overflow]]}}</ref> सी ++ 14 कैप्चर किए गए सदस्यों को मनमाने ढंग से अभिव्यक्तियों के साथ प्रारंभ करने की अनुमति देता है। यह वैल्यू-मूव द्वारा कब्जा करने और लैम्ब्डा के मनमानी सदस्यों को घोषित करने की अनुमति देता है, बाहरी दायरे में एक समान रूप से नामित चर के बिना।<ref name=isocpp/>
सी++11 लैम्ब्डा फ़ंक्शंस मूल्य-कॉपी या संदर्भ द्वारा उनके बाहरी दायरे में घोषित चर को कैप्चर करता है। इसका मतलब है कि लैम्ब्डा के मूल्य सदस्य केवल-चलने वाले प्रकार नहीं हो सकते हैं।<ref>{{cite web|title=Move capture in Lambda|url=https://stackoverflow.com/questions/8640393/move-capture-in-lambda|website=[[Stack Overflow (website)|Stack Overflow]]}}</ref> सी ++ 14 कैप्चर किए गए सदस्यों को मनमाने ढंग से अभिव्यक्तियों के साथ प्रारंभ करने की अनुमति देता है। यह वैल्यू-मूव द्वारा कब्जा करने और लैम्ब्डा के मनमानी सदस्यों को घोषित करने की अनुमति देता है, बाहरी दायरे में एक समान रूप से नामित चर के बिना।<ref name=isocpp/>


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


== संकलक समर्थन ==
== संकलक समर्थन ==
[[बजना]] ने 3.4 में सी++14 के लिए समर्थन समाप्त कर दिया, हालांकि मानक नाम सी++1वाई के तहत, और क्लैंग 6 में सी++14 को डिफ़ॉल्ट सी++ मानक बनाया।<ref>{{cite web|title=C++ Support in Clang|url=http://clang.llvm.org/cxx_status.html|access-date=28 May 2016}}</ref> GNU कंपाइलर संग्रह ने GCC 5 में C++14 के लिए समर्थन समाप्त कर दिया, और C++14 को GCC 6 में डिफ़ॉल्ट C++ मानक बना दिया।<ref>{{cite web|title=C++ Standards Support in GCC|url=https://gcc.gnu.org/projects/cxx-status.html|access-date=28 May 2016}}</ref> [[Microsoft Visual Studio]] 2017 ने लगभग सभी C++14 सुविधाओं को लागू कर दिया है।<ref>{{cite web|url=https://blogs.msdn.microsoft.com/vcblog/2017/03/07/c-standards-conformance-from-microsoft/|title=C++ Standards Conformance from Microsoft|date=7 March 2017|access-date=7 March 2017}}</ref>
[[बजना]] ने 3.4 में सी++14 के लिए समर्थन समाप्त कर दिया, हालांकि मानक नाम सी++1वाई के तहत, और क्लैंग 6 में सी++14 को डिफ़ॉल्ट सी++ मानक बनाया।<ref>{{cite web|title=C++ Support in Clang|url=http://clang.llvm.org/cxx_status.html|access-date=28 May 2016}}</ref> GNU कंपाइलर संग्रह ने GCC 5 में सी++14 के लिए समर्थन समाप्त कर दिया, और सी++14 को GCC 6 में डिफ़ॉल्ट सी++ मानक बना दिया।<ref>{{cite web|title=C++ Standards Support in GCC|url=https://gcc.gnu.org/projects/cxx-status.html|access-date=28 May 2016}}</ref> [[Microsoft Visual Studio]] 2017 ने लगभग सभी सी++14 सुविधाओं को लागू कर दिया है।<ref>{{cite web|url=https://blogs.msdn.microsoft.com/vcblog/2017/03/07/c-standards-conformance-from-microsoft/|title=C++ Standards Conformance from Microsoft|date=7 March 2017|access-date=7 March 2017}}</ref>





Revision as of 12:26, 5 March 2023

सी++14, सी++ प्रोग्रामिंग भाषा के मानकीकरण के लिए अंतर्राष्ट्रीय संगठन/अंतर्राष्ट्रीय इंटरनेशनल इलेक्ट्रोटेक्नीकल कमीशन मानक का संस्करण है। इसका उद्देश्य सी++11 पर कम विस्तार होना है, जिसमें मुख्य प्रकार से बग फिक्स और छोटे सुधार सम्मिलित हैं, और इसे सी++17 द्वारा प्रतिस्थापित किया गया था। इसकी स्वीकृति की घोषणा 18 अगस्त 2014 को की गई थी।[1] सी++14 को दिसंबर 2014 में आईएसओ/आईइसी 14882:2014 के रूप में प्रकाशित किया गया था।[2] क्योंकि पहले के सी++ मानक संशोधनों में काफी देर हो चुकी थी, सी++1वाई नाम का उपयोग कभी-कभी इसके अनुमति तक किया जाता था, इसी प्रकार सी++11 मानक को 2010 से पहले इसकी रिलीज की अपेक्षा के साथ सी++ 0एक्स कहा जाता था (चूँकि वास्तव में यह 2010 और अंत में 2011 में स्खलित हो गया)।

नई भाषा सुविधाएँ

ये सी ++ 14 की मुख्य भाषा में जोड़े गए फीचर हैं।

फंक्शन रिटर्न टाइप डिडक्शन

सी++11 ने रिटर्न स्टेटमेंट को दिए गए एक्सप्रेशन के प्रकार के आधार पर रिटर्न प्रकार को निकालने के लिए लैम्ब्डा फ़ंक्शन (कंप्यूटर प्रोग्रामिंग) की अनुमति दी। सी++14 सभी कार्यों के लिए यह क्षमता प्रदान करता है। यह इन सुविधाओं को लैम्ब्डा कार्यों तक विस्तारित करता है, जो उन कार्यों के लिए रिटर्न प्रकार की कटौती की अनुमति देता है जो फॉर्म के नहीं हैं return expression;.[3] रिटर्न टाइप डिडक्शन को प्रेरित करने के लिए, फ़ंक्शन को घोषित किया जाना चाहिए auto वापसी प्रकार के रूप में, लेकिन सी ++ 11 में अनुगामी रिटर्न प्रकार विनिर्देशक के बिना:

<वाक्यविन्यास लैंग = सीपीपी> ऑटो DeduceReturnType (); // रिटर्न प्रकार निर्धारित किया जाना है। </वाक्यविन्यास हाइलाइट>

यदि फ़ंक्शन के कार्यान्वयन में कई रिटर्न एक्सप्रेशन का उपयोग किया जाता है, तो उन सभी को एक ही प्रकार का अनुमान लगाना चाहिए।[4] उनके रिटर्न प्रकार को निकालने वाले कार्यों को आगे घोषित किया जा सकता है, लेकिन जब तक उन्हें परिभाषित नहीं किया जाता तब तक उनका उपयोग नहीं किया जा सकता। उनकी परिभाषाएँ उनका उपयोग करने वाली अनुवाद इकाई के लिए उपलब्ध होनी चाहिए।

इस प्रकार के फ़ंक्शन के साथ प्रत्यावर्तन का उपयोग किया जा सकता है, लेकिन फ़ंक्शन की परिभाषा में कम से कम एक रिटर्न स्टेटमेंट के बाद रिकर्सिव कॉल होना चाहिए:[4]

<वाक्यविन्यास लैंग = सीपीपी> ऑटो सही (int i) {

 अगर (मैं == 1)
   वापसी मैं; // रिटर्न प्रकार int के रूप में घटाया गया
 वापसी सही (i-1)+i; // ठीक है इसे अभी कॉल करें

}

ऑटो गलत (int i) {

 अगर (मैं! = 1)
   वापसी गलत (i-1)+i; // इसे कॉल करना बहुत जल्दबाजी होगी। कोई पूर्व रिटर्न स्टेटमेंट नहीं।
 वापसी मैं; // रिटर्न प्रकार int के रूप में घटाया गया

} </वाक्यविन्यास हाइलाइट>

घोषणा पर वैकल्पिक प्रकार की कटौती

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

<वाक्यविन्यास लैंग = सीपीपी> int मैं; इंट एंड& च (); ऑटो x3a = मैं; // decltype(x3a) int है घोषणापत्र (i) x3d = i; // decltype(x3d) int है ऑटो x4a = (मैं); // decltype(x4a) इंट है decltype ((i)) x4d = (i); // decltype(x4d) int& है ऑटो x5a = च (); // decltype(x5a) int है decltype (एफ ()) x5d = एफ (); // decltype(x5d) int&& है </वाक्यविन्यास हाइलाइट>

सी ++ 14 जोड़ता है decltype(auto) वाक्य - विन्यास। यह अनुमति देता है auto घोषणाओं का उपयोग करने के लिए decltype दी गई अभिव्यक्ति पर नियम। decltype(auto) e> सिंटैक्स का उपयोग #Function रिटर्न टाइप डिडक्शन के साथ भी किया जा सकता है decltype(auto) इसके बजाय सिंटैक्स auto फ़ंक्शन के रिटर्न प्रकार की कटौती के लिए।[4]


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

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

सी++14 इन प्रतिबंधों को शिथिल करता है। Constexpr-घोषित कार्यों में अब निम्नलिखित शामिल हो सकते हैं:[3]

  • को छोड़कर कोई भी घोषणा:
    • static या thread_local चर।
    • प्रारंभिक के बिना परिवर्तनीय घोषणाएं।
  • सशर्त ब्रांचिंग स्टेटमेंट if और switch.
  • रेंज-आधारित सहित कोई भी लूपिंग स्टेटमेंट for.
  • अभिव्यक्तियाँ जो किसी वस्तु के मूल्य को बदल देती हैं यदि उस वस्तु का जीवनकाल स्थिर अभिव्यक्ति समारोह के भीतर शुरू होता है। इसमें किसी भी गैर-const constexpr-घोषित गैर-स्थैतिक सदस्य कार्य।

goto सी ++ 14 आराम से कॉन्स्टैक्स-घोषित कार्यों में बयान प्रतिबंधित हैं।

साथ ही, सी ++ 11 ने कहा कि सभी गैर-स्थैतिक सदस्य कार्य घोषित किए गए थे constexpr भी स्पष्ट रूप से घोषित किए गए थे const, इसके संबंध में this. वह तब से हटा दिया गया है; गैर-स्थैतिक सदस्य कार्य गैर-स्थैतिक हो सकते हैंconst.[6] हालांकि, उपरोक्त प्रतिबंधों के अनुसार, एक गैर-const constexpr सदस्य फ़ंक्शन केवल एक वर्ग सदस्य को संशोधित कर सकता है यदि उस वस्तु का जीवनकाल निरंतर अभिव्यक्ति मूल्यांकन के भीतर शुरू हुआ हो।

चर टेम्पलेट्स

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

विशेषज्ञता सहित ऐसी घोषणाओं और परिभाषाओं पर टेम्प्लेट के सामान्य नियम लागू होते हैं।[7][8] <वाक्यविन्यास लैंग = सीपीपी> टेम्पलेट <टाइपनेम टी> constexpr टी पाई = टी (3.141592653589793238462643383);

// सामान्य विशेषज्ञता नियम लागू होते हैं: टेम्पलेट <> constexpr const char* pi<const char*> = pi; </वाक्यविन्यास हाइलाइट>

सकल सदस्य आरंभीकरण

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

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


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

सी ++ 14 में संख्यात्मक अक्षर बाइनरी संख्या में निर्दिष्ट किए जा सकते हैं।[3]सिंटैक्स उपसर्गों का उपयोग करता है 0b या 0B. सिंटैक्स का उपयोग अन्य भाषाओं में भी किया जाता है उदा। जावा (प्रोग्रामिंग भाषा), सी शार्प (प्रोग्रामिंग लैंग्वेज) | सी #, स्विफ्ट (प्रोग्रामिंग भाषा), जाओ (प्रोग्रामिंग भाषा), स्काला (प्रोग्रामिंग भाषा), रूबी (प्रोग्रामिंग भाषा), पायथन (प्रोग्रामिंग लैंग्वेज), OCaml, और एक के रूप में कम से कम 2007 से कुछ सी कंपाइलर्स में अनौपचारिक विस्तार।[10]


अंक विभाजक

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

<वाक्यविन्यास लैंग = सीपीपी> ऑटो पूर्णांक_लिटरल = 1'000'000; ऑटो फ्लोटिंग_पॉइंट_लिटरल = 0.000'015'3; ऑटो बाइनरी_लिटरल = 0b0100'1100'0110; ऑटो a_dozen_crores = 12'00'00'000; </वाक्यविन्यास हाइलाइट>

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

सी ++ 11 में, अज्ञात फ़ंक्शन पैरामीटर को ठोस प्रकारों के साथ घोषित करने की आवश्यकता है। सी ++ 14 इस आवश्यकता को आराम देता है, जिससे लैम्ब्डा फ़ंक्शन पैरामीटर को घोषित किया जा सकता है auto प्रकार विनिर्देशक।[7] <वाक्यविन्यास लैंग = सीपीपी> ऑटो लैम्ब्डा = [] (ऑटो एक्स, ऑटो वाई) {रिटर्न एक्स + वाई;}; </वाक्यविन्यास हाइलाइट>

विषय में auto प्रकार की कटौती, सामान्य लैम्ब्डा टेम्पलेट तर्क कटौती के नियमों का पालन करते हैं (जो समान हैं, लेकिन सभी मामलों में समान नहीं हैं[clarification needed]). उपरोक्त कोड इसके बराबर है:[12] <वाक्यविन्यास लैंग = सीपीपी> struct {

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

} लैम्ब्डा {}; </वाक्यविन्यास हाइलाइट>

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

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

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

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

<वाक्यविन्यास लैंग = सीपीपी> ऑटो लैम्ब्डा = [मूल्य = 1] {वापसी मूल्य;}; </वाक्यविन्यास हाइलाइट>

लैम्ब्डा समारोह lambda रिटर्न 1, जो क्या है value के साथ प्रारंभ किया गया था। घोषित कैप्चर प्रारंभकर्ता अभिव्यक्ति से प्रकार को कम करता है जैसे कि द्वारा auto.

यह मानक के उपयोग के माध्यम से चाल से कब्जा करने के लिए इस्तेमाल किया जा सकता है std::move समारोह:

<वाक्यविन्यास लैंग = सीपीपी> std::unique_ptr<int> ptr(new int(10)); ऑटो लैम्ब्डा = [मूल्य = एसटीडी :: चाल (पीटीआर)] {वापसी * ​​मूल्य;}; </वाक्यविन्यास हाइलाइट>

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

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

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

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

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

} </वाक्यविन्यास हाइलाइट>

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

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

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


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

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

सी ++ 14 लुकअप को मनमाना प्रकार के माध्यम से करने की अनुमति देता है, जब तक कि तुलना ऑपरेटर उस प्रकार की तुलना वास्तविक कुंजी प्रकार से कर सकता है।[16] यह एक मानचित्र की अनुमति देगा std::string ए के खिलाफ तुलना करने के लिए कुछ मूल्य const char* या कोई अन्य प्रकार जिसके लिए a operator< अधिभार उपलब्ध है। यह a में समग्र वस्तुओं को अनुक्रमित करने के लिए भी उपयोगी है std::set उपयोगकर्ता को मजबूर किए बिना एकल सदस्य के मूल्य से find एक डमी वस्तु बनाने के लिए (उदाहरण के लिए एक संपूर्ण बनाना struct Person नाम से किसी व्यक्ति को खोजने के लिए)।

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


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

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

  • एस, विभिन्न बनाने के लिए std::basic_string प्रकार।
  • एच, मिनट, एस, एमएस, यूएस, एनएस, संबंधित बनाने के लिए std::chrono::duration समय अंतराल।
  • if , i , il , संबंधित बनाने के लिए std::complex<float>, std::complex<double> और std::complex<long double> काल्पनिक संख्या।

<वाक्यविन्यास लैंग = सीपीपी> ऑटो स्ट्र = हैलो वर्ल्ड एस; // ऑटो स्ट्रिंग घटाता है ऑटो ड्यूर = 60s; // ऑटो क्रोनो :: सेकेंड घटाता है ऑटो जेड = 1i; // ऑटो जटिल <डबल> घटाता है </वाक्यविन्यास हाइलाइट>

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


=== टाइप === के माध्यम से टपल एड्रेसिंग std::tuple ई> सी ++ 11 में पेश किया गया प्रकार टाइप किए गए मानों को एक संकलन-समय निरंतर पूर्णांक द्वारा अनुक्रमित करने की अनुमति देता है। सी ++ 14 इसे इंडेक्स के बजाय टाइप द्वारा टपल से लाने की अनुमति देने के लिए विस्तारित करता है।[16]यदि टपल में एक से अधिक प्रकार के तत्व हैं, तो एक संकलन-समय त्रुटि परिणाम:[19] <वाक्यविन्यास लैंग = सीपीपी> टपल <स्ट्रिंग, स्ट्रिंग, इंट> टी (फू, बार, 7); int i = get<int>(t); // मैं == 7 int j = get<2>(t); // पहले जैसा: j == 7 स्ट्रिंग एस = <स्ट्रिंग> (टी) प्राप्त करें; // अस्पष्टता के कारण संकलन-समय त्रुटि </वाक्यविन्यास हाइलाइट>

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

std::make_unique जैसे प्रयोग कर सकते हैं std::make_shared के लिए std::unique_ptr वस्तुओं।[7]

std::integral_constant एक प्राप्त किया operator() अधिभार निरंतर मान वापस करने के लिए।[16]

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