2016-10-11 9 views
17

optional और variant के बारे में एक सतत बहस है, विशेष रूप से असाइनमेंट के संबंध में संदर्भ प्रकारों के साथ करना चाहिए। मैं इस मुद्दे के आसपास बहस को बेहतर ढंग से समझना चाहता हूं। तर्क से बचने और अभी भी हम कार्यक्षमता के सबसे देने के लिए -वैकल्पिक <T&> असाइनमेंट पर पुनर्विचार क्यों करना चाहिए?

optional<T&> opt; 
opt = i; 
opt = j; // should this rebind or do i=j? 

वर्तमान में, निर्णय optional<T&> बीमार का गठन कर सकते हैं और variant::operator= बीमार का गठन करता है, तो प्रकारों में से किसी एक संदर्भ प्रकार है बनाने के लिए है।

क्या तर्क है कि opt = j अंतर्निहित संदर्भ को पुनर्जीवित करना चाहिए?

template <class T> 
struct optional<T&> { 
    T* ptr = nullptr; 

    optional& operator=(T& rhs) { 
     ptr = &rhs; 
     return *this; 
    } 
}; 
+3

ठीक है, आपके उदाहरण में, यदि 'opt = i' संदर्भ को बाध्य करता है और फिर' opt = j' संदर्भ के माध्यम से असाइन करता है, तो क्या यह अजीब महसूस नहीं करेगा? –

+1

आप असाइनमेंट का उपयोग करके सामान्य संदर्भों को शायद ही सीमित कर सकते हैं। –

+0

विशेष रूप से अजीब अगर 'ऑप्ट' फ़ंक्शन पैरामीटर के रूप में आया, और यह रनटाइम पर निर्भर करता है कि 'opt = i;' –

उत्तर

20

तर्क यह है कि चुनते = j अंतर्निहित संदर्भ rebind चाहिए क्या है: दूसरे शब्दों में, क्यों हम optional इस तरह लागू करना चाहिए?

मुझे नहीं पता कि आप "तर्क" क्या खोज रहे हैं। लेकिन तुम सिर्फ "एक तर्क" प्रस्तुत किया है इसके लिए:

optional<T&> opt; 
opt = i; 
opt = j; 

अब, नाटक है कि दूसरी और तीसरी पंक्ति एक दूसरे से दूर कर रहे हैं। यदि आप केवल कोड पढ़ रहे हैं, तो आप opt = j क्या करने की अपेक्षा करेंगे? या अधिक बिंदु पर, आप अपने व्यवहार को opt = i से अलग क्यों उम्मीद करेंगे?

एक रैपर प्रकार का व्यवहार करने के लिए पूरी तरह से अपने वर्तमान राज्य पर पूरी तरह से आधारित होने के लिए बहुत आश्चर्यजनक होगा।

इसके अलावा, हमारे पास पहले से ही संवाद करने का एक तरीका है कि आप optional के अंदर मूल्य बदलना चाहते हैं। अर्थात्: । यह optional<T&> के लिए भी काम करता है क्योंकि यह optional<T> के लिए करता है।

optional काम बहुत आसान है: यह एक रैपर प्रकार है। वर्तमान में मौजूदा रैपर प्रकारों की तरह, उन पर संचालन रैपर को प्रभावित करता है, न कि चीज को लपेटा जा रहा है। लिपटे चीज को प्रभावित करने के लिए, आप स्पष्ट रूप से * या -> या कुछ अन्य इंटरफ़ेस फ़ंक्शन का उपयोग करते हैं।

+3

आपका अंतिम अनुच्छेद मुझे सबसे अधिक आकर्षक लगता है - रैपर पर ऑपरेशन रैपर को प्रभावित करता है। लेकिन बाकी सभी को भी समझ में आता है। – Barry

+0

असल में, यह ऑपरेटर = प्रकार टी का उपयोग न करने का तर्क है जब संदर्भ शामिल नहीं होते हैं, भले ही संदर्भ शामिल नहीं होते हैं। –

+1

@ ГригорийШуренков वाट? इस मामले में 'ऑपरेटर =' क्या करना चाहिए इसका कोई सवाल नहीं है। केवल एक चीज है जिसका अर्थ संभवतः हो सकता है। – Barry

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