2015-02-04 25 views
6

Here वर्णन किया गया है nullopt_t और nulloptoptional वस्तु ग के लिए ++ प्रस्तावित के लिए:प्रयोगात्मक :: वैकल्पिक nullopt_t निर्माता

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

[...] प्रकार nullopt_t एक डिफ़ॉल्ट निर्माता नहीं होगा। यह शाब्दिक प्रकार होगा। निरंतर नलोपट को शाब्दिक प्रकार के के साथ प्रारंभ किया जाएगा।

इस का कारण यह दस्तावेज़ के The op = {} syntax अध्याय में समझाया गया है: op = {} स्पष्ट होने के लिए कुछ चाल अपनाए जाने वाले हैं, जिनमें से एक यह है कि nullopt_t डिफ़ॉल्ट constructible नहीं होना चाहिए है।

मेरा प्रश्न इस बारे में है कि शाब्दिक प्रकार का अर्थ क्या है? मुझे यह SO post मिला। तो मुझे लगता है कि सिर्फ एक और खाली कक्षा होगी। क्या यह int लेने वाला एक कन्स्ट्रक्टर भी हो सकता है?

कम से कम nullopt_t वर्ग की तरह दिखने वाला क्या होगा?

कुछ इस तरह:

struct nullopt_t_construct_tag_t{}; 

struct nullopt_t { 
    nullopt_t() = delete; // I know declaring it as deleted is redundant 
    constexpr nullopt_t(nullopt_t_construct_tag_t) {}; 
}; 

constexpr nullopt_t nullopt(nullopt_t_construct_tag_t{}); 

या इस:

struct nullopt_t { 
    nullopt_t() = delete; 
    constexpr nullopt_t(int) {}; 
}; 

constexpr nullopt_t nullopt(0); 

उत्तर

5

एक न्यूनतम कार्यान्वयन

struct nullopt_t { 
    constexpr nullopt_t(int) {} 
}; 

कोई डिफ़ॉल्ट निर्माता परोक्ष घोषित हो जाएगा, [class.ctor]/4:

यदि कक्षा X के लिए कोई उपयोगकर्ता द्वारा घोषित कन्स्ट्रक्टर नहीं है, तो कोई कन्स्ट्रक्टर कोई पैरामीटर नहीं है जिसे निश्चित रूप से डिफ़ॉल्ट (8.4) घोषित किया जाता है।

... और nullopt_tint, एक शाब्दिक प्रकार से बनाया जा सकता है।
ध्यान दें कि आपके कोड में एक डिफ़ॉल्ट कन्स्ट्रक्टर मौजूद है, हालांकि हटाए गए रूप में परिभाषित किया जा रहा है।

उपरोक्त परिभाषा एक शाब्दिक प्रकार के लिए आवश्यकताओं को पूरा करता है:

एक प्रकार एक शाब्दिक प्रकार है अगर यह होता है:
(10.5) - एक वर्ग का प्रकार (धारा 9) सब है कि निम्नलिखित गुण की:

  • यह एक छोटी सी नाशक है,
  • यह एक समग्र प्रकार (8.5.1) है या कम से कम एक constexpr निर्माता है [..] कि मैं एक कॉपी या चालक नहीं है, और
  • इसके सभी गैर स्थैतिक डेटा सदस्य और बेस क्लास गैर-अस्थिर शाब्दिक प्रकार के हैं।
+0

कार्यान्वयन मुद्दों की गुणवत्ता में इस रन है, जहां एक 'int' एक वैकल्पिक करने के लिए पारित किया जा सका है, और यह एक' nullopt_t' में बदल जाती है और वैकल्पिक निर्माण करने के लिए इस्तेमाल किया, और अप्रत्याशित बातों परिणाम? – Yakk

+0

@Yakk यदि वैकल्पिक का मान प्रकार एक int से बनाया जा सकता है, तो अधिभार संकल्प सुनिश्चित करेगा कि सही कन्स्ट्रक्टर (टेम्पलेट) चुना गया है। यदि नहीं ... तो आप सही हैं। उपरोक्त कन्स्ट्रक्टर को स्पष्ट करना उस समस्या को हल करना चाहिए। – Columbo

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