C++14

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

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

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

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

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

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

<वाक्यविन्यास लैंग = सीपीपी> ऑटो सही (int i) { अगर (मैं == 1) वापसी मैं; // रिटर्न प्रकार int के रूप में घटाया गया

वापसी सही (i-1)+i; // ठीक है इसे अभी कॉल करें }

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

वापसी मैं; // रिटर्न प्रकार int के रूप में घटाया गया } 

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

<वाक्यविन्यास लैंग = सीपीपी> 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 जोड़ता है  वाक्य - विन्यास। यह अनुमति देता है   घोषणाओं का उपयोग करने के लिए   दी गई अभिव्यक्ति पर नियम।   e> सिंटैक्स का उपयोग #Function रिटर्न टाइप डिडक्शन के साथ भी किया जा सकता है   इसके बजाय सिंटैक्स   फ़ंक्शन के रिटर्न प्रकार की कटौती के लिए।

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

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


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

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

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

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

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

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

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

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

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

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

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

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

विषय में  प्रकार की कटौती, सामान्य लैम्ब्डा टेम्पलेट तर्क कटौती के नियमों का पालन करते हैं (जो समान हैं, लेकिन सभी मामलों में समान नहीं हैं). उपरोक्त कोड इसके बराबर है: <वाक्यविन्यास लैंग = सीपीपी> struct { टेम्पलेट <टाइपनाम टी, टाइपनाम यू> ऑटो ऑपरेटर (टी एक्स, यू वाई) कास्ट {रिटर्न एक्स + वाई;} } लैम्ब्डा {}; 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


 * एस, विभिन्न बनाने के लिए  प्रकार।
 * एच, मिनट, एस, एमएस, यूएस, एनएस, संबंधित बनाने के लिए  समय अंतराल।
 * if, i , il , संबंधित बनाने के लिए ,   और   काल्पनिक संख्या।

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

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

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

छोटी पुस्तकालय सुविधाएँ
जैसे प्रयोग कर सकते हैं  के लिए   वस्तुओं।

एक प्राप्त किया  अधिभार निरंतर मान वापस करने के लिए।

वर्ग टेम्पलेट  और संबंधित उपनाम टेम्पलेट संकलन-समय पूर्णांक अनुक्रमों का प्रतिनिधित्व करने के लिए जोड़े गए थे, जैसे पैरामीटर पैक में तत्वों के सूचकांक। वैश्विक /  कार्यों को बढ़ाया गया  /  कार्य, जो निरंतर पुनरावर्तक लौटाते हैं, और  /  और  /  जो रिवर्स इटरेटर लौटाते हैं।   e> फ़ंक्शन टेम्प्लेट एक चर के लिए एक नया मान निर्दिष्ट करता है और पुराना मान लौटाता है। के नए अधिभार,  , और   दूसरी श्रेणी के लिए पुनरावृत्तियों की एक जोड़ी लें, ताकि कॉलर को अलग से यह जांचने की आवश्यकता न हो कि दो श्रेणियां समान लंबाई की हैं।

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

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

बाहरी संबंध

 * C++14: What you need to know Overview of features in Dr. Dobb's, 16 Sept. 2014