2013-07-06 19 views
13

निम्न उदाहरण है जहाँ हम डेटा पार्स और अगले कार्य करने के लिए परिणाम पारित करने पर विचार से स्थानांतरित करने के लिए:कैसे std :: वैकल्पिक <T>

Content Parse(const std::string& data); 
void Process(Content content); 

int main() 
{ 
    auto data = ReadData(); 
    Process(Parse(data));  
} 

अब एक असफल पार्स करने कदम को संभालने के लिए std::optional का उपयोग कर कोड बदलने:

optional<Content> Parse(const std::string& data); 
void Process(Content content); 

int main() 
{ 
    auto data = ReadData(); 
    auto content = Parse(data); 
    if (content) 
     Process(move(*content)); 
} 

क्या यह optional<T>::value() से स्थानांतरित करने के लिए मान्य है? यदि यह std::optional के लिए ठीक है यह boost::optional रूप में अच्छी तरह के लिए मान्य है?

+0

मैं इस ठीक होगा लगता होगा। इसमें शामिल होने के बाद निहित मान वैध लेकिन अनिर्दिष्ट स्थिति में होना चाहिए। –

उत्तर

9

इसके बाद से यह एक परिवर्तनशील संदर्भ देता है और इस कदम वस्तु को नष्ट नहीं करता optional<T>::value() से स्थानांतरित करने के लिए मान्य है। optional उदाहरण नहीं लगे हुए है, तो value() एक bad_optional_access अपवाद फेंक देंगे (§20.6.4.5)।

आप स्पष्ट रूप से जाँच करें कि क्या विकल्प लगी हुई है:

if (content) 
    Process(move(*content)); 

लेकिन आप अंतर्निहित T तक पहुँचने के लिए सदस्य value() प्रयोग नहीं करते। ध्यान दें कि value() वैध T& लौटने से पहले आंतरिक रूप से एक चेक करता है, operator* के विपरीत, जिसमें पूर्व शर्त है कि optional उदाहरण संलग्न होगा। यह एक सूक्ष्म अंतर है, लेकिन आप सही मुहावरा का उपयोग करें:

if (o) 
    f(*o) 

रूप

if (o) // redundant check 
    f(o.value()) 

बूस्ट में करने का विरोध किया, स्थिति थोड़ा अलग है: पहला, वहाँ कोई सदस्य समारोह value() कहा जाता है मौजूद है चेक की गई पहुंच प्रदान करता है। (ए bad_optional_access अपवाद बस मौजूद नहीं है)। सदस्य get() सिर्फ operator* के लिए एक उपनाम है और हमेशा उपयोगकर्ता जाँच कि optional उदाहरण लगी हुई है पर निर्भर करता है।

+0

करता है 'ऑपरेटर *' एक rvalue संदर्भ अधिभार है? हां, 'एफ (* std :: move (o))' - क्या वह कदम है? मुझे ऐसी ही उम्मीद है! – Yakk

+0

मैं में एक नहीं पा सके [मानक] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf)। पृष्ठ 505 पर §20.6.4 पर एक नज़र डालें जहां इंटरफेस का वर्णन किया गया है। – mavam

+1

हम्म। 'value_or' में' &&' और '&' अधिभार है। 'मान' नहीं है (क्यों नहीं? Naively, यह चाहिए)। मैं 'यदि' optional' पहले लगी हुई है की जाँच के बिना नहीं चाहते एक '' && मामले लोगों में 'ऑपरेटर *' '* करने के लिए परीक्षा रहे हैं देख सकते हैं, लेकिन फेंक' मान' मैं नुकसान नहीं देख सकते हैं के साथ? – Yakk

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