6

को यहां तक ​​कि उदाहरण को देखते हुए, मुझे आश्चर्य हुआ कि डिफ़ॉल्ट कन्स्ट्रक्टर को स्पष्ट रूप से हटाया जा रहा है (या उस मामले के लिए डिफ़ॉल्ट बना दिया गया है) के बावजूद, कुल प्रारंभिकता संभव रही।कुल प्रारंभिकता कन्स्ट्रक्टर एक्सेस

#include <iostream> 

struct DefaultPrivate 
{ 
     const int n_; 
     static const DefaultPrivate& create(); 

    private: 
     DefaultPrivate() = delete; 
}; 

const DefaultPrivate& DefaultPrivate::create() 
{ 
    static DefaultPrivate result{10}; 
    return result; 
} 

int main() { 
    DefaultPrivate x; //Fails 
    DefaultPrivate y{10};//Works 
    return 0; 
} 

क्या निजी डिफ़ॉल्ट (या हटाए गए) निर्माण और कुल प्रारंभिक मानक के बीच संबंध मानक में निर्दिष्ट नहीं है?

यह दोनों जीसीसी 6.3 और VCC 2017

कारण मैं सवाल पूछ रहा हूँ पर मामला था मैं आशा व्यक्त की कि कि डिफ़ॉल्ट निर्माता के लिए उपयोग को बदलने के सी से सार्वजनिक कुल प्रारंभ

+0

मेरी माफी, मैंने देखा है और उस हिस्से को हटा देगा। मैंने एच फ़ाइल को संशोधित किया और किसी कारण से मेरी सीपीपी फ़ाइल –

उत्तर

4

रोका जा सके ++ 11, list initialization के लिए,

तो T एक समग्र प्रकार है, कुल प्रारंभ किया जाता है।

और साथ सी ++ 11 एक aggregate निम्नलिखित प्रकार से एक है:

...

वर्ग प्रकार (आमतौर पर, struct या संघ), है कि

  • ...

  • कोई उपयोगकर्ता द्वारा प्रदत्त , inherited, or explicit (since C++17) कंस्ट्रक्टर्स (explicitly defaulted or deleted constructors are allowed) (since C++11)

  • ...

से सी ++ 11 इसका मतलब है, स्पष्ट रूप से नष्ट कर दिया कंस्ट्रक्टर्स साथ वर्ग अभी भी एक समग्र प्रकार, तो कुल प्रारंभ अनुमति दी है के रूप में माना जाता है।

और प्रभाव है:

प्रत्येक direct public base, (since C++17) सरणी तत्व, या गैर स्थिर वर्ग के सदस्य, सरणी सबस्क्रिप्ट/वर्ग परिभाषा उपस्थिति के क्रम में, है कॉपी-प्रारंभ प्रारंभकर्ता की इसी खंड से सूची।

ध्यान दें कि DefaultPrivate y{10}; के लिए, उपरोक्त प्रक्रिया में डिफ़ॉल्ट निर्माता बिल्कुल, तथ्य यह है कि यह delete रूप में घोषित किया है और private कोई फर्क नहीं होगा विचार नहीं किया जाएगा तो।

Btw: DefaultPrivate x;default initialization के लिए किया जाता है,

अगर T एक non-POD (until C++11) वर्ग प्रकार, कंस्ट्रक्टर्स माना जाता है और खाली तर्क सूची के खिलाफ संकल्प को ओवरलोड के अधीन हैं है।चयनित कन्स्ट्रक्टर (जो डिफ़ॉल्ट कन्स्ट्रक्टर में से एक है) को नई ऑब्जेक्ट के लिए प्रारंभिक मान प्रदान करने के लिए कहा जाता है;

इसलिए डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग करने की कोशिश की जाती है लेकिन यह delete एड है तो संकलन विफल रहता है।

यदि आप कुल आरंभिक उपयोग करते हैं, जैसे DefaultPrivate x{};, कोड भी ठीक काम करेगा; और n_value initialized (और फिर zero initialized) 0 के रूप में होगा।

LIVE

+0

को फिर से संकलित नहीं किया गया, हां, यह प्रकार कुल है, लेकिन यह निजी अर्थ में कुल है, या मैं उम्मीद कर रहा था कि यह होगा, अन्यथा मैं कुल में उपयोग नहीं करता शीर्षक –

+1

@WernerErasmus उत्तर संशोधित। मुद्दा यह है कि इस मामले के लिए रचनाकारों पर विचार नहीं किया जाएगा, इसलिए इससे कोई फर्क नहीं पड़ता। – songyuanyao

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