2015-12-03 21 views
5

यह permitable इस तरह से डिजाइन करने के लिए std::optional (वर्तमान में std::experimental::optional) है भी तुच्छता डिफ़ॉल्ट constructible है, तुच्छता डिफ़ॉल्ट constructible प्रकार T इसी std::optional<T> के लिए है?तुच्छता डिफ़ॉल्ट constructible std :: वैकल्पिक और std :: संस्करण

वही प्रश्न std::variant और इसके अभिन्न भेदभावकर्ता को नियंत्रित करता है।

मेरा स्वयं का जवाब है: "नहीं, इसे इस तरह से डिज़ाइन नहीं किया जा सकता है, क्योंकि डिफ़ॉल्ट प्रारंभिकरण के दौरान प्राप्त अपने अभिन्न भेदभावकर्ता का मूल्य अनिश्चित होगा यदि ऑब्जेक्ट में स्वचालित संग्रहण अवधि हो या यदि यह reinterpret_cast- गैर- शून्य-प्रारंभिक भंडारण। " उपयोगकर्ता को मूल्य-प्रारंभ करने के लिए हर बार मेरे दिमाग की अनुमति नहीं है।

+0

क्या मैं आपको विनिमय में पूछ सकता हूं कि यह आपके लिए महत्वपूर्ण क्यों है? मैं कल्पना कर सकता हूं कि आप वैकल्पिक रूप से कॉपी करने योग्य क्यों होंगे। लेकिन क्यों मामूली-डिफ़ॉल्ट-रचनात्मक? यह आपको क्या खरीदता है? – Andrzej

+0

@Andrzej कंटेनर (जैसे 'वैकल्पिक' या 'variant') जितना संभव हो उतना सामान्य होना चाहिए, है ना? मैं constexpr के लिए ['variant'] डिजाइन करने का प्रयास करता हूं (http://codereview.stackexchange.com/questions/112218/trivial-full-fledged-variant-for-constexpr-proof-of-concept)। और वर्तमान में यह क्षमता से ऊपर है। लेकिन मुझे लगता है "शायद मुझे इनकार करना चाहिए?"। – Orient

+0

@Andrzej आखिरकार मुझे अपने 'संस्करण' में एक "बग" मिला। डिफ़ॉल्ट प्रारंभिक ऑब्जेक्ट्स में संकलन समय (constexpr) और रनटाइम में अलग-अलग व्यवहार होते हैं। फिर मैंने [intiializations] (http://en.cppreference.com/w/cpp/language/initialization) के बारे में पढ़ा। और पता चला कि स्टैक पर मेरे डिफ़ॉल्ट इंटिअलाइज्ड 'संस्करण' का उपयोग करने के लिए यूबी है। – Orient

उत्तर

8

आपका उत्तर सही है: आप नहीं कर सकते। विनिर्देश के लिए आवश्यक है कि इसका "प्रारंभिक ध्वज" डिफ़ॉल्ट निर्माण पर false पर सेट हो।

3

जैसा कि आपने स्वयं को समझाया है, आप इस तरह से std :: वैकल्पिक को लागू नहीं कर सकते हैं, क्योंकि आप इसके अर्थशास्त्र को बदल देंगे (is_trivially_default_constructible क्लास इंटरफ़ेस का हिस्सा है)।

हालांकि, अगर आपको अपने कोड में किसी कारण से इस अर्थशास्त्री की आवश्यकता है, तो कोई कारण नहीं है, आप एक बहुत ही समान वैकल्पिक वर्ग को क्यों कार्यान्वित नहीं कर सकते जो कि डिफ़ॉल्ट रूप से डिफॉल्ट कन्स्ट्रबल है। फिर, जब उपयोग किया जाता है, तो शून्य इसे {} के माध्यम से प्रारंभ करें और - यदि आप यही चाहते हैं - बूल ऑपरेटर में शून्य को सही मानें।

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