15 जुलाई को '17 P0329R4 को स्वीकार किया गयाc ++ 20मानक: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0329r4.pdf
यह सीमित समर्थन लाता हैc99आरंभिक पदनाम। इस सीमा को C.1.7 द्वारा इस प्रकार वर्णित किया गया है [diff.decl] .4, दिया गया:
struct A { int x, y; };
struct B { struct A a; };
सी में मान्य निम्नलिखित निर्दिष्ट प्रारंभियाँ C ++ में प्रतिबंधित हैं:
struct A a = { .y = 1, .x = 2 }
C ++ में अमान्य है क्योंकि डेटा सदस्यों को डेटा सदस्यों के घोषणा क्रम में दिखाई देना चाहिए
int arr[3] = { [1] = 5 }
C ++ में अमान्य है क्योंकि सरणी निर्दिष्ट आरंभीकरण समर्थित नहीं है
struct B b = {.a.x = 0}
C ++ में अमान्य है क्योंकि डिज़ाइनर नेस्टेड नहीं हो सकते
struct A c = {.x = 1, 2}
C ++ में अमान्य है क्योंकि सभी या डेटा सदस्यों में से कोई भी पदनामकों द्वारा आरंभीकृत नहीं किया जाना चाहिए
के लिये c ++ 17और पहले बूस्ट में वास्तव में नामित इंटेलाइज़र्स के लिए समर्थन है और समर्थन को जोड़ने के लिए कई प्रस्ताव आए हैंc ++मानक, उदाहरण के लिए: n4172 और प्रारंभिक करने के लिए पदनाम वॉकर के प्रस्ताव को जोड़ने का प्रस्ताव । प्रस्तावों के कार्यान्वयन का हवाला देते हैंc99विज़ुअल C ++ में शुरुआती डिज़ाइनर, gcc और Clang का दावा:
हमारा मानना है कि बदलाव लागू करने के लिए अपेक्षाकृत सरल होंगे
लेकिन मानक समिति बार-बार ऐसे प्रस्तावों को खारिज करती है , जिसमें कहा गया है:
EWG ने प्रस्तावित दृष्टिकोण के साथ विभिन्न समस्याएं पाईं, और यह नहीं सोचा कि समस्या को हल करने की कोशिश करना संभव है, क्योंकि इसे कई बार आजमाया गया है और हर बार यह विफल रहा है
बेन वोइगट की टिप्पणियों ने मुझे इस दृष्टिकोण के साथ दुर्गम समस्याओं को देखने में मदद की; दिया हुआ:
struct X {
int c;
char a;
float b;
};
इन कार्यों को किस क्रम में बुलाया जाएगा? c99: struct X foo = {.a = (char)f(), .b = g(), .c = h()}
? हैरानी की बात है, मेंc99:
किसी भी आरंभक में उपमेय के मूल्यांकन का क्रम अनिश्चित रूप से अनुक्रमित है [ 1 ]
(विजुअल C ++, gcc , और Clang में व्यवहार पर सहमति व्यक्त की गई है क्योंकि वे सभी इस क्रम में कॉल करेंगे :)
h()
f()
g()
लेकिन मानक की अनिश्चित प्रकृति का मतलब है कि अगर इन कार्यों में कोई भी परस्पर क्रिया होती है तो परिणामी कार्यक्रम स्थिति भी अनिश्चित होगी, और संकलक आपको चेतावनी नहीं देगा : क्या दुर्व्यवहार के बारे में चेतावनी प्राप्त करने का एक तरीका है डिजाइन किए गए शुरुआती?
c ++ करता कड़े प्रारंभकर्ता-सूची आवश्यकताओं है 11.6.4 [dcl.init.list] 4:
ब्रैड-इन-लिस्ट के इनिशियलाइज़र-लिस्ट के भीतर, इनिशियलाइज़र-क्लॉज़, जिसमें पैक विस्तार (17.5.3) से कोई भी परिणाम शामिल होता है, का मूल्यांकन उस क्रम में किया जाता है जिसमें वे दिखाई देते हैं। यही है, किसी दिए गए इनिशलाइज़र-क्लॉज से जुड़े हर वैल्यू कंप्यूटेशन और साइड ई with एक्ट को किसी भी इनिशिएटिव-क्लॉज से जुड़े हर वैल्यू कंप्यूटेशन और साइड इफेक्ट से पहले सीक्वेंस किया जाता है, जो इसे इनिशियलाइज़र-लिस्ट के कॉमा सेपरेटेड लिस्ट में फॉलो करता है।
इसलिए c ++ समर्थन के लिए इस आदेश में निष्पादित होना आवश्यक है:
f()
g()
h()
पिछले के साथ संगतता तोड़ c99कार्यान्वयन।
जैसा कि ऊपर चर्चा की गई है, इस मुद्दे को डिजाइन किए गए प्रारंभिकों पर सीमाओं को दरकिनार कर दिया गया हैc ++ 20। वे एक मानकीकृत व्यवहार प्रदान करते हैं, नामित शुरुआती के निष्पादन के आदेश की गारंटी देते हैं।