2014-11-12 12 views
5

बूस्ट के साथ मैं यथा-स्थान के साथ एक वैकल्पिक बना सकते हैं: std :: experimental :: वैकल्पिक कैसे अक्षम करें?

boost::optional<boost::asio::io_service::work> work = boost::in_place(boost::ref(io_service)); 

और साथ यह छुड़ाना:

work = boost::none; 

/प्रयोगात्मक समर्थन के साथ सी ++ 14, मैं बजाय में एक वैकल्पिक निर्माण कर सकते हैं साथ -Place:

std::experimental::optional<boost::asio::io_service::work> work; 
work.emplace(boost::asio::io_service::work(io_service)); 

लेकिन यह कैसे छुड़ाना करने के लिए एक नुकसान में रहा हूँ ...

उत्तर

9
work = std::experimental::nullopt; 

work छुड़ाना चाहिए।

The struct nullopt_t is an empty structure type used as a unique type to indicate a disengaged state for optional objects.

वहाँ एक उपयुक्त असाइनमेंट ऑपरेटर है, [optional.object.assign]:
[optional.nullopt] में library fundamental TS निर्दिष्ट

optional<T>& operator=(nullopt_t) noexcept; 

Effects: If *this is engaged calls val->T::~T() to destroy the contained value; otherwise no effect.

एक nullopt_t वस्तु हर बार निर्माण से बचने के लिए इस प्रकार का निरंतर पहले ही घोषित किया गया है:

struct nullopt_t{see below};
constexpr nullopt_t nullopt(unspecified);

+0

किसी भी मामले में आप 'nullopt_t' प्रकार की वस्तु का निर्माण कर सकते हैं, केवल' ish) तरीका 'nullopt'' की प्रतिलिपि बनाकर है। –

+0

@ ल्यूकडेंटन ... या 'nullopt_t' प्रकार की ऑब्जेक्ट की प्रतिलिपि बनाना जिसे' nullopt' की प्रतिलिपि बनाकर प्रारंभ किया गया था। – Columbo

+0

और इसलिए, आखिरकार, यह सब 'nullopt' पर आता है। –

1

हेडर के माध्यम से पढ़ने के बाद, std :: प्रयोगात्मक :: छुड़ाना करने का सही तरीका वैकल्पिक प्रकट होता है होने के लिए:

work = std::experimental::nullopt; 
3

वैकल्पिक को अक्षम करने का यह सबसे आसान तरीका है foo = {}; के साथ, जिसे एक विघटित प्रावधान optional से चाल असाइनमेंट के रूप में हल किया गया है। विनिर्देश वास्तव में इस वाक्यविन्यास को सक्षम करने के अपने तरीके से बाहर चला जाता है जो अन्यथा निहित प्रकार से असाइनमेंट के साथ संदिग्ध होगा। ([optional.object.assign] para 18-23 in N4023 for details देखें)

+2

हम्म, मेरे उदाहरण के साथ जो एक कंपाइलर त्रुटि फेंकता है: त्रुटि: हटाए गए फ़ंक्शन 'std :: experimental :: वैकल्पिक और std :: experimental :: वैकल्पिक :: ऑपरेटर = (std :: प्रयोगात्मक :: वैकल्पिक <बढ़ावा देने :: asio :: io_service :: काम> &&) ' – Riot

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