2014-11-11 22 views
12

के लिए वैकल्पिक विशेषज्ञता क्यों std::optional (std::experimental::optionallibC++ इस समय में) संदर्भ प्रकार के लिए विशेषज्ञता की जरूरत नहीं है (boost::optional की तुलना में)?std :: संदर्भ प्रकार

मुझे लगता है कि यह बहुत उपयोगी विकल्प होगा।

वहाँ एसटीएल में संदर्भ को शायद पहले से ही विद्यमान वस्तु अर्थ विज्ञान के साथ कुछ वस्तु है?

+9

अंततः मैं निष्कर्ष निकाला हूं कि मैं अपने उद्देश्यों के लिए 'std :: वैकल्पिक >' का उपयोग कर सकता हूं। – Orient

उत्तर

7

जब n3406 (प्रस्ताव के संशोधन # 2) पर चर्चा की गई, कुछ समिति के सदस्य वैकल्पिक संदर्भों से असहज थे। n3527 (संशोधन # 3) में, लेखकों ने वैकल्पिक संदर्भों को अनुमोदित वैकल्पिक मूल्यों को अनुमोदित करने और सी ++ 14 बनने की संभावनाओं को बढ़ाने के लिए वैकल्पिक संदर्भ बनाने का निर्णय लिया। वैकल्पिक वैकल्पिक रूप से इसे अन्य कारणों से सी ++ 14 में नहीं बनाया गया, समिति ने वैकल्पिक संदर्भों को अस्वीकार नहीं किया और भविष्य में वैकल्पिक संदर्भ जोड़ने के लिए स्वतंत्र है, किसी को इसका प्रस्ताव देना चाहिए।

0

अगर मुझे लगता है कि यह अनुमान लगाएगा, तो यह इस वाक्य के कारण std :: experimental :: वैकल्पिक के विनिर्देशन में होगा। (धारा 5.2, p1)

एक प्रोग्राम है जो एक संदर्भ प्रकार, या संभवतः सीवी योग्य प्रकार in_place_t या nullopt_t के लिए के लिए टेम्पलेट optional की इन्स्टेन्शियशन जरूरी बीमार का गठन है।

+2

शायद यह सही है, लेकिन मैं शांत निष्कर्ष की पृष्ठभूमि को समझ नहीं सकता। – Orient

+0

@ ऑरेंट जो "वैकल्पिक 'के लिए मानक है, संदर्भों और इन दो विशेष प्रकारों के साथ प्रयोग नहीं किया जा सकता है" - दूसरे शब्दों में यह उनके साथ काम करने के लिए डिज़ाइन नहीं किया गया है। असल में, आपका प्रश्न यह कहने का एक और माध्यम है कि "उस खंड में मानक क्यों है?" –

+1

@ArneMertz आप सही हैं, लेकिन धूमकेतु के इरादे को समझना महत्वपूर्ण है। – Orient

4

वहाँ वास्तव में कुछ संदर्भ को शायद मौजूदा ऑब्जेक्ट अर्थ विज्ञान किया है। इसे एक (कॉन्स) सूचक कहा जाता है। एक सादा पुराना गैर-मालिक सूचक।

  1. प्वाइंटर अशक्त हो सकता है, संदर्भ नहीं कर सकते हैं: वहाँ संदर्भ और संकेत के बीच तीन मतभेद हैं। यह बिल्कुल अंतर है जिसे आप std::optional से बाधित करना चाहते हैं।
  2. पॉइंटर्स को किसी अन्य चीज़ पर इंगित करने के लिए रीडायरेक्ट किया जा सकता है। इसे बनाओ, और वह अंतर भी गायब हो जाता है।
  3. संदर्भों को -> या * द्वारा अस्वीकृत करने की आवश्यकता नहीं है। यह शुद्ध वाक्य रचनात्मक चीनी है और 1 की वजह से संभव है। और पॉइंटर सिंटैक्स (डीरफ्रेंसिंग और बूल के लिए परिवर्तनीय) बिल्कुल std::optional मूल्य तक पहुंचने और इसकी उपस्थिति का परीक्षण करने के लिए प्रदान करता है।

अद्यतन: optional मूल्यों के लिए एक कंटेनर है। अन्य कंटेनरों की तरह (vector, उदाहरण के लिए) को संदर्भों के लिए डिज़ाइन नहीं किया गया है। यदि आप एक वैकल्पिक संदर्भ चाहते हैं, तो पॉइंटर का उपयोग करें, या यदि आपको वास्तव में std::optional पर समान वाक्यविन्यास वाला इंटरफ़ेस चाहिए, तो पॉइंटर्स के लिए एक छोटा (और छोटा) रैपर बनाएं।

Update2: सवाल क्यों ऐसी कोई विशेषज्ञता है के लिए के रूप में: क्योंकि समिति बस इसे बाहर जाने का चुनाव किया था। तर्क कागजात में कहीं भी पाया जा सकता है। यह संभवतः इसलिए है क्योंकि वे पॉइंटर्स को पर्याप्त मानते हैं।

+10

फिर भी, जेनेरिक प्रोग्रामिंग के लिए आप 'std :: वैकल्पिक 'काम करना चाहते हैं, तब भी जब टी == यू &'। आप काफी अच्छी तरह से समझाते हैं कि 'std :: optinal ' 'U * const' के साथ कार्यान्वित किया जा सकता है लेकिन यह वास्तव में जेनेरिक प्रोग्रामिंग में सहायता नहीं है। – MSalters

+2

@MSalters मुझे नहीं लगता कि आप ऐसा क्यों चाहते हैं। 'वैकल्पिक' मूल्यों के लिए सख्ती से है। उत्तर में मेरा अपडेट देखें। "जेनेरिक प्रोग्रामिंग" कुछ भी कल्पना करने योग्य होने के लिए एक ब्लैंको औचित्य नहीं है। यदि आप ऐसे अवसर पर आते हैं जहां आप वैकल्पिक मूल्यों * और * वैकल्पिक संदर्भों का समर्थन करना चाहते हैं, तो 'वैकल्पिक' और पॉइंटर्स या रैपर वर्ग के बीच distingusih के लिए विशेषज्ञता का उपयोग करें। –

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