पृष्ठभूमि: मैं एक बड़े कोड वातावरण में हूं जहां अपरिभाषित क्रम जिसमें वैश्विक रचनाकार चल रहे हैं समस्याग्रस्त है। तो मेरे पास एक कस्टम क्लास है जिसे पहली बार उपयोग तक प्रारंभ करने में देरी के लिए डिज़ाइन किया गया है। इसका सभी जादू इसके ऑपरेटर * और ऑपरेटर-> कार्यों के अंदर होता है; वे एकमात्र चीज परिभाषित हैं। यह स्वचालित-प्रारंभिक फ़ंक्शन पर उपलब्ध कराने के लिए, स्वयं के भीतर कुछ राज्य भी संग्रहीत करता है। निश्चित रूप से, राज्य को पीओडी होना चाहिए, ताकि पूरी कक्षा पीओडी हो, ताकि किसी के कोड चलने से पहले इसे पूरी तरह से स्थापित किया जा सके, ताकि हर जगह सभी कोड हर जगह सभी ग्लोबल्स का उपयोग कर सकें, बिना डर के कि ग्लोबल्स ' अभी तक स्थापित नहीं किया गया है।सी ++ 11: क्या एक असाइनमेंट ऑपरेटर पीओडी होने से एक प्रकार को रोकता है, और इस प्रकार वैश्विक-आरंभिक होता है?
कुछ समय पहले किसी ने एक निजी, कभी-कभी परिभाषित असाइनमेंट ऑपरेटर जोड़ा, ताकि इस प्रकार को कभी भी असाइन नहीं किया जाएगा (इसे किसी भी तरह से बदलने के लिए डिज़ाइन नहीं किया गया है)। अब कोई और कह रहा है कि कक्षा टूट गई है क्योंकि यह पीओडी नहीं है। यदि इसके बजाय घोषित किया गया है लेकिन परिभाषित नहीं किया गया है, तो मैं इसे "= हटाएं" के रूप में घोषित करता हूं, मैं सोच रहा हूं कि यह किसी भी तरह बेहतर है। और वास्तव में, उस परिवर्तन के साथ, std :: is_pod <> :: मूल्य प्रकार के लिए सत्य देता है।
लेकिन क्या असाइनमेंट ऑपरेटर पीओडी होने से एक प्रकार को रोकता है? मैंने सोचा कि आवश्यकताएं सिर्फ इसलिए थीं कि इसमें केवल सार्वजनिक डेटा सदस्य, कोई वर्चुअल विधियां नहीं थीं, और कोई कन्स्ट्रक्टर या विनाशक नहीं था।
और मेरी स्थिति के लिए और अधिक बिंदु: क्या कभी-कभी परिभाषित असाइनमेंट ऑपरेटर की मौजूदगी वैश्विक स्तर पर सभी अन्य वैश्विक पीओडी के साथ वैश्विक प्रारंभिक समय पर कक्षा को शुरू करने में सक्षम होने से रोकती है?
घटित उदाहरण:
struct LazyString {
const char *c_str;
bool has_been_inited;
string *lazy_str_do_not_use_directly;
string &operator*() { return *get(); }
string *operator->() { return get(); }
private:
string *get() {
// The real code uses a mutex, of course, to be thread-safe.
if (!has_been_inited) {
lazy_str_do_not_use_directly = new string(c_str);
has_been_inited = true;
}
return lazy_str_do_not_use_directly;
}
// Does this make the class non-POD?
// If so, does that mean that global variables of this type
// will not be initialized at global-initialization time, that wonderful
// moment in time where no code has yet been run?
void operator=(const LazyString&);
// If I do this instead, it breaks C++03 compatibility, but is this somehow better?
void operator=(const LazyString&) = delete;
};
LazyString lazy = { "lazy" };
int main(int argc, char *argv[]) {
std::cout << *lazy;
}
अपना खुद का ढेर मेमोरी प्रबंधन बनाना लगभग कोई अच्छा विचार नहीं है। आपको ऐसा क्यों लगता है कि आपको इसकी आवश्यकता है? (क्या आपका मतलब है [एसएच-ऑन-राइट] [http://stackoverflow.com/questions/12199710/legality-of-cow-stdstring-implementation-in-c11)) –
आप भ्रमित पीओडी-नेस और स्थिर प्रारंभिकरण। न तो दूसरे पर निर्भर है। –
चूंकि सभी डेटा सदस्य सार्वजनिक रूप से दिखाई दे रहे हैं, इसलिए घोषणा एक पीओडी बनाती है, हां। ** नोट: ** आप इस पीओडी प्रकार को प्रतिलिपि/असाइन करते समय, 'नई स्ट्रिंग (c_str);' अपने _lazy प्रारंभिक_ में 'अवांछित साइड इफेक्ट्स का अनुभव करेंगे। –