2016-01-07 14 views
8

मैं सी ++ ऑब्जेक्ट्स को क्रमबद्ध करने/डी-क्रमबद्ध करने के लिए कुछ मेटा डेटा मॉडल करने का प्रयास कर रहा हूं। यहां कुछ ऐसा है जो मुझे आवश्यकतानुसार & बोल्ट को पकड़ता है; यह जीसीसी 5.2 (g++ sample.cpp -std=c++14) और क्लैंग 3.6 (clang++ sample.cpp -std=c++14) के साथ संकलित करता है।अपूर्ण प्रकार और प्रारंभकर्ता_सूची

मेरा प्रश्न उदाहरण में struct TypeInfo के बारे में है। इसमें स्वयं के std::initializer_list शामिल हैं। क्या यह मानक-अनुरूप है?

#include <cstdint> 
#include <initializer_list> 

enum class TypeCode : std::uint8_t { BOOLEAN, INT, OBJECT, STRING, SENTINEL }; 

struct TypeInfo 
{ 
    TypeCode typeCode_; 

    char fieldName_[64]; 

    union 
    { 
     std::uint16_t textMinLength_; 
     std::uint16_t objectVersionMajor_; 
    }; 

    union 
    { 
     std::uint16_t textMaxLength_; 
     std::uint16_t objectVersionMinor_; 
    }; 

    // set only if typeCode_ = OBJECT 
    std::initializer_list <TypeInfo> objectTypeInfos_; 
}; 

int main() 
{ 
    TypeInfo const sti { TypeCode::STRING, "updatedBy", { .textMinLength_ = 0 }, { .textMaxLength_ = 16 } }; 

    TypeInfo const iti { TypeCode::INT, "amount", { 0 }, { 0 } }; 

    TypeInfo const oti { TypeCode::OBJECT, "startTime", { .objectVersionMajor_ = 1 }, { .objectVersionMinor_ = 0 }, { 
     TypeInfo { TypeCode::INT, "weekdays", { 0 }, { 0 } }, 
     TypeInfo { TypeCode::INT, "timeOfDay", { 0 }, { 0 } }, 
     TypeInfo { TypeCode::STRING, "timezone", { .textMinLength_ = 0 }, { .textMaxLength_ = 5 } } 
    } }; 

    TypeInfo const noti { TypeCode::OBJECT, "schedule", { .objectVersionMajor_ = 1 }, { .objectVersionMinor_ = 0 }, { 
     TypeInfo { TypeCode::INT, "id", { 0 }, { 0 } }, 
     TypeInfo { TypeCode::STRING, "description", { .textMinLength_ = 0 }, { .textMaxLength_ = 16 } }, 
     TypeInfo { TypeCode::OBJECT, "startTime", { .objectVersionMajor_ = 1 }, { .objectVersionMinor_ = 0 }, { 
     TypeInfo { TypeCode::INT, "weekdays", { 0 }, { 0 } }, 
     TypeInfo { TypeCode::INT, "timeOfDay", { 0 }, { 0 } }, 
     TypeInfo { TypeCode::STRING, "timezone", { .textMinLength_ = 0 }, { .textMaxLength_ = 5 } } 
     } } 
    } }; 
} 

उत्तर

3

जो वास्तव में वर्तमान शब्द के साथ अनिर्धारित व्यवहार को प्रेरित करता है। std::initializer_list<TypeInfo> की इन्स्टेन्शियशन के बिंदु पर, TypeInfo अधूरा है, इसलिए [res.on.functions]/(2.5) लागू होता है:

विशेष रूप से, प्रभाव निम्नलिखित मामलों में अपरिभाषित हैं:
(2.5) - यदि एक अधूरा प्रकार (3.9) टेम्पलेट तर्क के रूप में प्रयोग किया जाता है जब टेम्पलेट घटक को तत्कालित करता है, जब तक कि विशेष रूप से उस घटक को अनुमति नहीं दी जाती।

... और अधूरे प्रकारों को विशेष रूप से initializer_list के लिए अनुमति नहीं दी गई है - हालांकि, यह स्पष्ट रूप से दोषपूर्ण है। LWG issue 2493 opts इसे ठीक करने के:

std::initializer_list<T> के विशिष्ट यूज-केस T के निर्माता की एक पास-दर-मूल्य पैरामीटर के लिए है। हालांकि, इस [res.on.functions] का उल्लंघन /2.5 क्योंकि initializer_list नहीं विशेष रूप से अधूरा प्रकार की अनुमति देते हैं (जैसा कि उदाहरण std::unique_ptr ([unique.ptr]/5) और std::enable_shared_from_this ([util.smartptr.enab के लिए करते हैं ]/2))।

एक संकल्प प्रासंगिक पाठ को ऐसे पैराग्राफ से कॉपी-पेस्ट करना होगा।

आईई। आपका कोड ठीक है (और उपर्युक्त डीआर के संकल्प के बाद आधिकारिक तौर पर ठीक होगा)।

+2

... कम से कम मानते हुए कि डीआर को हल किया गया है जैसा कि आप स्पष्ट रूप से उम्मीद करते हैं। दायर होने के बाद से कोई कार्रवाई नहीं की गई है, इसलिए इसे अभी भी "एनएडी" के रूप में हल किया जा सकता है। मुझे संदेह है कि ऐसा होगा, लेकिन यह अभी भी एक ऐसा नहीं है कि इसे अपूर्ण प्रकारों को अनुमति देने के पक्ष में हल किया जाएगा। –

+0

@ जेरीकॉफिन यह दोष पूरी तरह से उचित है और तदनुसार हल किया जाएगा।मैं कई कारणों के बारे में सोच सकता हूं जो वर्तमान में यूबी इस कारण से हैं (उदाहरण के लिए सामान [इस] (http://coliru.stacked-crooked.com/a/ea23d84143def16f))। मुझे तुम्हारा मुद्दा नहीं दिख रहा है, क्षमा करें। – Columbo

+0

मेरा मुद्दा यह है कि डीआर को हल करने के लिए * जरूरी नहीं है * कोड के इस विशेष टुकड़े को परिभाषित व्यवहार किया गया है। हां, इसे केवल एक कथन जोड़कर हल किया जा सकता है कि 'प्रारंभकर्ता_सूची' को अपूर्ण प्रकार पर तत्काल किया जा सकता है। इसे एक और सीमित तरीके से भी हल किया जा सकता है (उदाहरण के लिए) एक अपूर्ण प्रकार पर इसके तत्कालता को अनुमति देता है जब एक सीटीआर के पैरामीटर के रूप में उपयोग किया जा रहा है, लेकिन फिर भी वर्तमान मामले को बाहर कर देता है। निचली पंक्ति: इसकी अनुमति होने की संभावना है, लेकिन निश्चित नहीं है। –

2

§ [res.on.functions]/2:

विशेष रूप से, प्रभाव निम्नलिखित मामलों में अपरिभाषित कर रहे हैं:
[...]
(2.5) - अगर टेम्पलेट घटक को तत्काल करते समय एक अधूरा प्रकार (3.9) टेम्पलेट तर्क के रूप में प्रयोग किया जाता है, जब तक कि विशेष रूप से उस घटक के लिए अनुमति न दी जाए। (या तो § [dcl.init.list] या कम से कम N4296 के रूप में § [support.init.list], में)

मैं के लिए initializer_list एक अधूरी प्रकार से अधिक instantiated जा करने के लिए ऐसी कोई विशिष्ट भत्ता देखते हैं।

+1

मुझे डाउनवोट समझ में नहीं आता है। – erip

+0

@erip: कुछ मामलों में, उन्हें बस समझा नहीं जा सकता है। कभी-कभी जीवन भी होता है। –

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