2012-05-28 11 views
22

मैं boost::optional सदस्य चर के साथ कक्षा में एक डिफ़ॉल्ट चालक कन्स्ट्रक्टर को परिभाषित करने का प्रयास कर रहा हूं।क्या कोई बढ़ावा :: वैकल्पिक स्थानांतरित करना संभव है?

#include <boost/optional.hpp> 
#include <utility> 
#include <vector> 

struct bar {std::vector<int> vec;}; 

struct foo { 
    foo() = default; 
    foo(foo&&) = default; 
    boost::optional<bar> hello; 
}; 

int main() { 
    foo a; 
    foo b(std::move(a)); 
} 

मेरा कंपाइलर दोनों चाल semantics और डिफ़ॉल्ट चाल चालकों का समर्थन करता है, लेकिन मैं इसे काम करने के लिए नहीं मिल सकता है।

% clang++ foo.cc -std=c++11 -stdlib=libc++ 
foo.cc:15:7: error: call to deleted constructor of 'foo' 
    foo b(std::move(a)); 
    ^~~~~~~~~~~~~ 
foo.cc:9:3: note: function has been explicitly marked deleted here 
    foo(foo&&) = default; 
^
1 error generated. 

वहाँ बूस्ट के स्रोत कोड को संशोधित के बिना एक boost::optionalस्थानांतरित करने के लिए एक तरीका है? या जब तक बूस्ट आगे बढ़ने का समर्थन करता है तब तक मुझे इंतजार करना चाहिए?

मुझे अतीत में boost::any के साथ एक ही समस्या थी।

+3

#boost में से किसी ने मुझे यह इंगित किया: https://svn.boost.org/trac/boost/ticket/1841 –

उत्तर

17

boost::optional स्रोत कोड देख रहे हैं, यह चालकों को स्थानांतरित करने या असाइनमेंट को स्थानांतरित नहीं करता है। हालांकि, यह कॉपी कन्स्ट्रक्टर और असाइनमेंट को परिभाषित करता है, जो संकलक को ऑटो-जनरेटिंग मूव कन्स्ट्रक्टर और इसके लिए असाइनमेंट से रोकता है।

Move constructor — Q&A देखें:

संकलक परोक्ष सदस्य के लिहाज से चलता रहता है के रूप में इस कदम निर्माता उत्पन्न होगा जब तक आप स्पष्ट एक प्रति निर्माता या कॉपी/चाल काम या एक नाशक परिभाषित किया है

ल्यूक के रूप में डैंटन का सुझाव है कि इसके लिए इलाज होना जरूरी है। के आशा में boost::optional स्थानांतरित करने के लिए है कि एक खाली boost::optional बनाने सस्ती है swap का उपयोग कर की कोशिश करते हैं और फिर हम सिर्फ स्वैप डिफ़ॉल्ट-निर्माण किया आर-मूल्य foo से एक है, जैसे के साथ boost::optional: के लिए

foo(foo&& b) { 
    hello.swap(b.hello); 
} 

और एक ही असाइनमेंट ले जाएं।

+0

यह एक सही निदान है, लेकिन आपको यह जवाब पूरा करने के लिए एक इलाज की ज़रूरत है! –

+0

आपने मुझे ल्यूक बना दिया!) –

+0

हम्म, यह दुर्भाग्यपूर्ण है। मैं एक रैपर वर्ग लिख सकता हूं जो 'std :: swap' का उपयोग करके आगे बढ़ने का समर्थन करता है, और' boost :: वैकल्पिक' में अंतर्निहित रूपांतरण। मुझे आशा है कि यह बूस्ट के अगले संस्करण में तय किया जाएगा। –

3

यह स्पष्ट नहीं है कि एजेंडा C++ 11 सुविधा समर्थन को बढ़ावा देने के लिए कितना अधिक है :: वैकल्पिक है।

मुझे इंटरनेट पर एक अच्छा साथी मिला जिसने मुझे अपने कुछ कोड को बूस्ट लाइसेंस के तहत दिया ... जो अभी भी कुछ बदलावों से गुजर रहा है। यह एक बिंदु पर है जहां यह मेरे लिए काम करता है।

https://github.com/hostilefork/CopyMoveConstrainedOptional

वहाँ भी एक std::optional जो जा रही है परिभाषित करने के लिए एक बड़े समूह प्रयास है ... लेकिन उनके संदर्भ कार्यान्वयन के कुछ संभाल करने में सक्षम नहीं था: शायद यह इस सवाल को देखकर किसी को भी मदद मिलेगी मामलों मैं था:

http://kojot.sggw.waw.pl/~akrzemi1/optional/tr2.optional.proposal.html

18

Boost.Optional चाल निर्माण केवल के बाद से बूस्ट संस्करण 1.56 का समर्थन करता है। the release notes देखें।