2016-10-30 17 views
48

मुझे * सी ++ संरचित बाइंडिंग here के लिए मूल प्रस्ताव मिला। यह आसानी से एक से अधिक रिटर्न मूल्यों बाध्य करने के लिए एक तरह से, यानी प्रस्ताव:क्यों सी ++ 17 संरचित बाइंडिंग {} का उपयोग नहीं करते हैं?

auto {a, b} = minmax(data); 

लेकिन अब मैं है कि हर कोई

auto [a, b] = minmax(data); 

की सी ++ 17/सी ++ 1Z प्रस्ताव वाक्य रचना के लिए अंक देख अब जब कि मैंने सीखा "सूचियां लिखी गई हैं {जैसे, यह}" एक नई सूची-वाक्यविन्यास आता है? क्यूं कर? घुंघराले ब्रेसिज़ के साथ समस्या क्या है?

+2

इस तरह आम तौर पर विचित्र परिवर्तन पार्सर्स के लिए जीवन को सरल बनाने के साथ करना है। – Yakk

+9

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

+3

नोट: अभी तक कोई सी ++ 17 नहीं है। सी ++ 17 अभी भी काम कर रहा है। इसमें क्या होगा और इसमें क्या नहीं होगा, और किस रूप में, कम से कम फरवरी तक निश्चित रूप से ज्ञात नहीं होगा। –

उत्तर

20

यह अभी भी बहस के तहत है। यह सुनिश्चित करना मुश्किल है कि कौन सा सिंटैक्स कम से कम भ्रमित होगा, यह देखते हुए कि [] और {} पहले से कितने उपयोग हैं।

वहाँ भी जोखिम है कि "कम से कम भ्रामक" और "पार्स करने के लिए सबसे आसान" संघर्ष में होगा।

+20

क्षमा मुझे, याद आती है (लेकिन वास्तव में उस ब्रेसिज़ मैं पिछली टिप्पणी में के बारे में भूल गया था का एक प्रकार है।) है, लेकिन है कि आपके सरणी के आकार में एक constexpr लैम्ब्डा, या एक संरचित बंधन पर एक विशेषता? –

+0

संभवतः प्रारंभिक क्लैंग ++ कार्यान्वयन जो हमें पहले से ही गड़बड़ कर देता है, फिर। – towi

9

जैक्सनविले के बाद {} से [] में परिवर्तन हुआ और उस बैठक से टिप्पणियों के जवाब में बनाया गया था। यह p0144r2 में विस्तृत है, जो कहता है: "क्योंकि यह एक ही प्रकार के एकाधिक चर घोषित करने के लिए मौजूदा वाक्यविन्यास से अधिक दृष्टि से अलग है।"

ऐसा लगता है कि नायब टिप्पणियों के मूल उपयोग करने के लिए एक परिवर्तन का अनुरोध {} नवंबर वर्ष 2016 की बैठकों में आम सहमति में वृद्धि नहीं था, [] उपयोग बरकरार छोड़कर। कम से कम वसंत बैठक तक।

+0

वास्तव में? अरे मेरा। क्या यह? – towi

+0

@towi यह उन बहुत ही व्यक्तिपरक बयान में से एक है। मैं जैक्सनविले में एक सत्र से मीटिंग मिनट युक्त कोई भी दस्तावेज नहीं ढूंढ पाया, जहां परिवर्तन प्रस्तावित किया गया था, इसलिए मैं केवल अनुमान लगा सकता हूं। –

20

स्पेन और अमेरिका से राष्ट्रीय निकायों {} वाक्य रचना क्योंकि (P0488R0) पर पूर्ववत का प्रस्ताव किया है:

"संरचित बाइंडिंग" प्रस्ताव मूल रूप ब्रेसिज़ इस्तेमाल किया "{}" बंधन पहचानकर्ता परिसीमित करने के लिए। delimiters के तहत "[]" को ब्रैकेट में बदल दिया गया था, उन्होंने दावा किया कि उन्होंने कोई वाक्य रचनात्मक समस्या नहीं पेश की है। हालांकि, वे गुणों और लैम्बडास के साथ वाक्य रचनात्मक अस्पष्टता पेश करने के लिए निकले। में विभिन्न सुझाए गए फ़िक्स का प्रकाश, ऐसा लगता है कि मूल वाक्यविन्यास अधिक पर्याप्त है।

इसलिए, अभी भी सी ++ 17 के लिए मूल वाक्यविन्यास होने की संभावना बनी हुई है (जिसे मैं दृढ़ता से विश्वास करता हूं कि अधिकांश उपयोगकर्ताओं द्वारा पसंद किया जाता है)।


अद्यतन इस trip report से:

अपघटन घोषणाओं के लिए मूल प्रस्ताव वाक्य रचना auto {a, b, c}; कि auto [a, b, c] करने के लिए पिछले बैठक में बदल गया था इस्तेमाल किया। यह परिवर्तन काफी विवादास्पद था, और कई टिप्पणियों ने इसे {} में बदलने के लिए कहा (जबकि अन्य ने [] को रखने के लिए प्रोत्साहित किया)। दोनों पक्षों पर तकनीकी तर्क ([] वाक्य रचना विशेषताओं के साथ संघर्ष कर सकते हैं एक बार आप नेस्टेड decompositions की इजाजत दी शुरू, यदि आप मिश्रण में अवधारणाओं फेंक और auto के बजाय एक अवधारणा-नाम का उपयोग की अनुमति देने के {} वाक्य रचना वर्दी आरंभीकरण के साथ संघर्ष कर सकते हैं) हैं, इसलिए अंत में यह काफी हद तक स्वाद का मामला है। क्लैंग कार्यान्वयनकर्ताओं ने रिपोर्ट की थी कि उन्होंने दोनों की कोशिश की, और [] के साथ काम करने के लिए अस्पष्टताएं आसान हो गईं।अंत में, बदलाव के लिए कोई सहमति नहीं थी, इसलिए स्थिति ([] वाक्यविन्यास) बनी हुई है।

+0

हालांकि मैं इस बात से सहमत है और न ही सीमांकक वापस मूल वाक्य रचना करने के लिए बदलने के लिए, मैं यह हास्यास्पद NBs में से एक अचानक या अंतिम मिनट के रूप में परिवर्तन का वर्णन किया है जब यह कई संशोधनों पहले बनाया गया था कि मिल रहा है की इच्छा से असहमत न।", नेस्टेड अपघटन घोषणाओं काम नहीं कर सकता के रूप में वे गुण वाक्य रचना के साथ संघर्ष": –

+0

@MikelF ES और अमेरिका के अलावा, वहाँ भी जीबी से एक संबंधित टिप्पणी है – metalfox

12

@ सेबेस्टियनवाहल ने केवल एक लिंक के साथ टिप्पणी की। मैं लिंक के पीछे सामग्री को जल्दी से सारांशित कर दूंगा। इस सवाल का

चांडलर Carruth के जवाब: youtu.be/430o2HMODj4?t=15m50s

auto [a,b,c] = f(); 

auto साथ ठीक है। लेकिन क्या आप भी ऐसा कर सकते हैं:

tuple<int,float,string> [a,b,c] = f(); 

तो जब आप {...} का उपयोग इस

tuple<int,float,string> {a,b,c} = f(); //<<< not C++17 

जो बुरा है बन जाएगा, क्योंकि टुकड़ा tuple<int,float,string> {a,b,c} भी सी में एक अर्थ है ++ और इस तरह एक होगा मुश्किल अस्पष्टता, हल करने में मुश्किल है।

3

एक बात वर्ग कोष्ठक वाक्य रचना के लिए कहा जा सकता है कि इसे बारीकी से, लैम्ब्डा कब्जा खंड है, जहां, इसी तरह, आप चर प्रकार निर्दिष्ट नहीं करते जैसा दिखता है के बाद से ऑटो निहित है है। अर्थात।

auto func = [a, b] {} 
auto func = [a=1, b=2.0] {} 

यह स्पष्ट रूप से सटीक एक ही बात नहीं है, लेकिन जब आप के रूप में इसके बारे में सोचो "संदर्भ से अर्थ निकालने से ऑटो कैप्चरिंग के लिए वाक्य रचना," यह काम कर सकते हैं:

auto [a, b] = std::make_pair(1, 2.0); 
संबंधित मुद्दे