C++14

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

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

फंक्शन रिटर्न टाइप परिणाम
सी++११ ने लैम्ब्डा फंक्शन को रिटर्न स्टेटमेंट को दिए गए एक्सप्रेशन के प्रकार के आधार पर रिटर्न टाइप निकलने की अनुमति दी है। सी++१४ सभी फंक्शन के लिए यह क्षमता प्रदान करता है। इन सुविधाओं को लैम्ब्डा फंक्शन तक विस्तारित करता है जो उन फंक्शन के लिए रिटर्न टाइप की परिणाम की अनुमति देता है,रिटर्न एक्सप्रेशन जो फॉर्म के नहीं हैं।

रिटर्न प्रकार के परिणाम को प्रेरित करने के लिए, फंक्शन को ऑटो रिटर्न प्रकार के साथ घोषित किया जाना चाहिए, परन्तु सी++११ पिछले रिटर्न प्रकार विनिर्देशक के बिना:

ऑटो रिटर्न प्रकार परिणाम ; // रिटर्न प्रकार निर्धारित किया जाना चाहिए।

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

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

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

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

आईएनटी  आई;

आईएनटी&& एफ ;

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

इस्ट्रक्ट

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

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

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

यह इनिसीअलाइज़र एक्सप्रेशन के उपयोग के माध्यम से किया जाता है:

ऑटो लैम्ब्डा = [वैल्यू = 1] {रिटर्न वैल्यू;};

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

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

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

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

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

डिप्रिकेटेड आईएनटी एफ;

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

वॉइड जी (इंट एंड एक्स);

वॉइड एच (इंट एंड एक्स);

वॉइड टेस्ट

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

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

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

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

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

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


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

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

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

ऑटो जेड = 1i; // ऑटो काम्प्लेक्स<डबल> घटाता है

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

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

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

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

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

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

छोटी पुस्तकालय सुविधाएँ
एसटीडी::मेक_यूनिक जैसे प्रयोग कर सकते हैं एसटीडी::मेक_सेयर्ड के लिए एसटीडी::यूनिक_पिटीआर आब्जेक्ट हैं।

एसटीडी::इंटीग्रल_कांस्टेंट ओवरलोड निरंतर मान रिटर्न करने के लिए ऑपरेटर प्राप्त किया है।

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

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

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

बाहरी संबंध

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