2015-10-18 10 views
13

में §5.2 [expr.post]/1 हमारे पास अभिव्यक्ति-सूचीदो सी ++ व्याकरण के साथ अनोखी

अभिव्यक्ति-सूची की परिभाषा:
          प्रारंभकर्ता-सूची

हमें दोनों परिभाषाओं की आवश्यकता क्यों है?

में §8.5 [dcl.init]/1 हमने:

braced-init-सूची:
          {प्रारंभकर्ता-सूची, ऑप्ट}
          {}

हमें वैकल्पिक वैकल्पिक , क्यों चाहिए?

ध्यान दें कि यह टुकड़ा संकलित:

struct A{ 
    int i; 
    float f; 
    A(int i, float f) : i(i), f(f) {} 
}; 

int main() 
{ 
    A a = { 1, 2., }; 
} 
+0

दूसरा सवाल पहले से ही कहीं उत्तर दिया गया है (जॉन खुद IIRC स्कीट द्वारा) – Columbo

+4

कहीं और जा रहा है [यहां] (http://stackoverflow.com/questions/7043372/int-a-1-2-weird-comma - किसी भी विशेष कारण) – chris

+5

ब्रेस्ड-इनिट सूचियों में ट्रेलिंग कॉमा सी से आते हैं, और जब आप ए) कुछ के साथ सूची उत्पन्न करते हैं तो वे उपयोगी होते हैं) जब आपके पास सूची कई पंक्तियों में फैली होती है और आप चाहते हैं कोई आइटम जोड़ने या सूची को सॉर्ट करने के लिए। समानता संपादन कार्य को आसान बनाने में मदद करती है। – PSkocik

उत्तर

19

वैकल्पिक अनुगामी अल्पविराम आसान कोड है कि मौजूदा लाइनों (स्रोत नियंत्रण के लिए अच्छा) को संशोधित किए बिना बढ़ाई है लिखने के लिए बनाता है।

उदाहरण के लिए

, एक सरणी बनाने:

int x[] = { 
    1, 
    2, 
    3, 
}; 

जिसमें आप जोड़ना चाहते हैं, तो आप सिर्फ एक नई लाइन पर 4, जोड़ने के लिए, और सब पर 3, के साथ लाइन को संशोधित करने से बचें। यह जरूरी नहीं है, लेकिन इसे अनुमति देना अच्छा है।

+7

स्वत: उत्पन्न सामग्री के लिए भी अच्छा है (यह अंतिम तत्व के लिए चेक जोड़ने के लिए स्पष्ट रूप से छोटा है, लेकिन यह कोड को अनिवार्य रूप से जटिल करता है)। –

+0

@ माटेटेओइटलिया, मिलें ['std :: experimental :: ostream_joiner'] (http://en.cppreference.com/w/cpp/experimental/ostream_joiner) :) – chris

+2

@ मैटेटेइटलिया: _" यह स्पष्ट रूप से चेक जोड़ने के लिए छोटा है अंतिम तत्व "_ [यह हमेशा सत्य नहीं है] (https://stackoverflow.com/questions/20633403/is-there-a-trick-to-allow-mysql-to-ignore-a-trailing-comma-in- सेट-क्लॉज-ओ # टिप्पणी 30887606_20633403) –

8

अनुगामी अल्पविराम सी से एक विरासत है, हम C99 rationale में यह उचित देख सकते हैं:

कश्मीर & आर एक प्रारंभकर्ता-सूची के अंत में एक प्रारंभकर्ता में पीछे अल्पविराम अनुमति देता है। मानक ने इस वाक्यविन्यास को बरकरार रखा है, क्योंकि यह प्रारंभकर्ता सूची से सदस्यों को जोड़ने या हटाने में लचीलापन प्रदान करता है, और ऐसी सूचियों की मशीन पीढ़ी को सरल बनाता है।

हाँ यह कानूनी है:

और यह भी कारण comp.lang.c++.moderated: Are comma-separated lists ending in a comma legal? में उद्धृत किया गया था।और एक कारण हर पंक्ति वाक्य रचना बड़े प्रारंभ से निपटने के लिए स्वत: उपकरण मदद करने के लिए इसी तरह की सूची में शामिल

हम Annotated C++ Reference Manual (एआरएम) है, जो बताते हैं में प्रारंभ की भिन्न शैलियों पर एक अधिक विस्तृत पृष्ठभूमि पा सकते हैं बनाने के लिए है व्याकरण में कुछ विषमताएं में से कुछ का मूल है, यह जोर मेरा साथ के बारे में [dcl.init] निम्नलिखित कहते हैं:

स्पष्ट रूप से initializations के लिए भी कई अंकन हैं, लेकिन प्रत्येक एक विशेष शैली की सेवा के लिए लगता है अच्छी तरह से उपयोग करने के लिए। = {startizer_list, opt} नोटेशन को से विरासत में मिला था और डेटा संरचनाओं और सरणी के प्रारंभ के लिए अच्छी तरह से कार्य करता है। [...] = अभिव्यक्ति नोटेशन सी से भी आता है और विशेष रूप से अंकगणित या सूचक प्रकार के सरल चर शुरू करने के लिए सबसे स्वाभाविक है [...] {अभिव्यक्ति-सूची} प्रारंभिकता के लिए नोटेशन सिमुला से आया था और सबसे अच्छा लगता है जब कोई ऐसे प्रकार की वस्तुएं बना रहा है जो अंकगणित मोल्ड के लिए नहीं हैं।

संबंधित मुद्दे