C++14

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

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

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

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

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

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

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

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

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

सिंटैक्स (वाक्य-रचना) का उपयोग फंक्शन रिटर्न टाइप परिणाम के साथ भी किया जा सकता है  इसके विपरीत सिंटैक्स (वाक्य-रचना)   फंक्शन के रिटर्न टाइप की परिणाम के लिए है।

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

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


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

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

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

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

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

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

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

बाइनरी शाब्दिक
C ++ 14 में संख्यात्मक अक्षर बाइनरी संख्या में निर्दिष्ट किए जा सकते हैं। सिंटैक्स उपसर्गों  या  का उपयोग करते हैं। सिंटैक्स का उपयोग अन्य भाषाओं में भी किया जाता है उदाहरण Java, C#, Swift, Go, Scala, Ruby, Python, OCaml, और कम से कम 2007 से कुछ C कंपाइलर्स में अनौपचारिक विस्तार के रूप में हुआ है।

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

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

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

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

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

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

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

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

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

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

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

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

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

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


 * "s", विभिन्न बनाने के लिए  टाइप है।
 * "h", "min", "s", "ms", "us", "ns" संबंधित बनाने के लिए  समय अंतराल है।
 * "if", "i", "il", संबंधित बनाने के लिए,   और   काल्पनिक संख्या है।

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

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

अस्पष्टता के कारण संकलन-समय त्रुटि है।

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

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

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

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

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

बाहरी संबंध

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