C++14: Difference between revisions

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


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


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


<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
Line 50: Line 50:
=== अल्टरनेट टाइप डिडक्शन पर डिक्लिरिएशन  ===
=== अल्टरनेट टाइप डिडक्शन पर डिक्लिरिएशन  ===


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


<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
Line 63: Line 63:
</syntaxhighlight>   
</syntaxhighlight>   


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


डेसिअलटाइप (ऑटो) सिंटैक्स (वाक्य-रचना) का उपयोग फंक्शन रिटर्न टाइप परिणाम के साथ भी किया जा सकता है डेसिअलटाइप (ऑटो) इसके विपरीत सिंटैक्स (वाक्य-रचना) ऑटो फंक्शन के रिटर्न टाइप की परिणाम के लिए है।<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>
decltype (auto) सिंटैक्स (वाक्य-रचना) का उपयोग फंक्शन रिटर्न टाइप परिणाम के साथ भी किया जा सकता है decltype (auto) इसके विपरीत सिंटैक्स (वाक्य-रचना) auto फंक्शन के रिटर्न टाइप की परिणाम के लिए है।<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>


[[Category:C++ कोड उदाहरण के साथ लेख]]
[[Category:C++ कोड उदाहरण के साथ लेख]]
Line 80: Line 80:
=== रिलैक्स्ड कॉन्स्टेक्सपर प्रतिबंध ===
=== रिलैक्स्ड कॉन्स्टेक्सपर प्रतिबंध ===


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


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


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

Revision as of 14:39, 24 May 2023

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 पिछले रिटर्न प्रकार विनिर्देशक के बिना:

auto DeduceReturnType();   // रिटर्न प्रकार निर्धारित किया जाना चाहिए।

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

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

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

auto Correct(int i)
{
  if (i == 1)
    return i;             // return type deduced as int

  return Correct(i-1)+i;  // ok to call it now
}

auto Wrong(int i)
{
  if (i != 1)
    return Wrong(i-1)+i;  // Too soon to call this. No prior return statement.

  return i;               // return type deduced as int
}

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

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

int   i;
int&& f();
auto          x3a = i;     // decltype(x3a) is int
decltype(i)   x3d = i;     // decltype(x3d) is int
auto          x4a = (i);   // decltype(x4a) is int
decltype((i)) x4d = (i);   // decltype(x4d) is int&
auto          x5a = f();   // decltype(x5a) is int
decltype(f()) x5d = f();   // decltype(x5d) is int&&

 

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

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

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

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

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

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

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

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

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

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

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

template<typename T>
constexpr T pi = T(3.141592653589793238462643383);

// Usual specialization rules apply:
template<>
constexpr const char* pi<const char*> = "pi";

ऐग्रीगेट मेंबर इनिसीअलाइजेशन

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

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

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

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

अंक विभाजक

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

auto integer_literal = 1'000'000;
auto floating_point_literal = 0.000'015'3;
auto binary_literal = 0b0100'1100'0110;
auto a_dozen_crores = 12'00'00'000;

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

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

auto lambda = [](auto x, auto y) {return x + y;};

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

struct
{
  template<typename T, typename U>
    auto operator()(T x, U y) const {return x + y;}
} lambda{};

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

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

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

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

auto lambda = [value = 1] {return value;};

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

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

std::unique_ptr<int> ptr(new int(10));
auto lambda = [value = std::move(ptr)] {return *value;};

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

[[deprecated]] int f();

[[deprecated("g() is thread-unsafe. Use h() instead")]]
void g( int& x );

void h( int& x );

void test()
{
  int a = f(); // warning: 'f' is deprecated
  g(a); // warning: 'g' is deprecated: g() is thread-unsafe. Use h() instead
}

नई स्टैण्डर्ड लाइब्रेरी सुविधाएँ

शेयर्ड म्यूटेक्स और लॉकिंग

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

अस्सोसिएटिव कंटेनरों में विषम लुकअप

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

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

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

स्टैण्डर्ड उपयोगकर्ता परिभाषित लिटरल

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

  • "s", विभिन्न बनाने के लिए एसटीडी::बेसिक_स्ट्रिंग टाइप है।
  • "h", "min", "s", "ms", "us", "ns" संबंधित बनाने के लिए एसटीडी::क्रोनो::ड्यूरेशन समय अंतराल है।
  • "if", "i", "il", संबंधित बनाने के लिए एसटीडी::काम्प्लेक्स<फ्लोट>, एसटीडी::काम्प्लेक्स<डबल> और एसटीडी::काम्प्लेक्स<लॉन्ग डबल> काल्पनिक संख्या है।
auto str = "hello world"s; // auto deduces string
auto dur = 60s;            // auto deduces chrono::seconds
auto z   = 1i;             // auto deduces complex<double>

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

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


tuple<string, string, int> t("foo", "bar", 7);
int i = get<int>(t);        // i == 7
int j = get<2>(t);          // Same as before: j == 7
string s = get<string>(t);  // Compile-time error due to ambiguity
अस्पष्टता के कारण संकलन-समय त्रुटि है।

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

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

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

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

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

संकलक समर्थन

क्लांग ने 3.4 में C++14 के लिए सपोर्ट समाप्त कर दिया, चूँकि मानक नाम C++1y के अनुसार, और क्लैंग 6 में C++14 को डिफ़ॉल्ट C++ मानक बनाया है।[20] जीएनयु कंपाइलर संग्रह ने जीसीसी 5 में C++14 के लिए सपोर्ट समाप्त कर दिया, और C++14 को जीसीसी 6 में डिफ़ॉल्ट C++ मानक बना दिया गया है।[21] माइक्रोसॉफ्ट विज़ुअल स्टुडिओ 2017 ने लगभग सभी C++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.

बाहरी संबंध