class my_class
{
...
my_class(my_class const &) = delete;
...
};
= delete
उस संदर्भ में क्या अर्थ है?कार्य घोषणा के बाद = हटाएं
क्या कोई अन्य "संशोधक" है (= 0
और = delete
के अलावा)?
class my_class
{
...
my_class(my_class const &) = delete;
...
};
= delete
उस संदर्भ में क्या अर्थ है?कार्य घोषणा के बाद = हटाएं
क्या कोई अन्य "संशोधक" है (= 0
और = delete
के अलावा)?
एक समारोह को हटाया जा रहा a C++11 feature है:
"नकल पर रोक लगाने के" के आम मुहावरा अब व्यक्त किया जा सकता सीधे:
class X { // ... X& operator=(const X&) = delete; // Disallow copying X(const X&) = delete; };
[...]
"हटाएँ "किसी भी समारोह के लिए तंत्र का उपयोग किया जा सकता है। उदाहरण के लिए, हम इस तरह किसी अवांछित रूपांतरण समाप्त कर सकते हैं:
struct Z { // ... Z(long long); // can initialize with an long long Z(long) = delete; // but not anything less };
कॉपी-सीटीओआर और ऑपरेटर = "निजी" बनाने के लिए "कॉपी करने पर रोक लगाने" की पारंपरिक विधि नहीं है? यह थोड़ा आगे जाता है और संकलक को भी उत्पन्न करने के लिए संकलक को निर्देश देता है। यदि वे दोनों निजी हैं और = हटाते हैं, तो दोबारा निषिद्ध है? –
@Reb, '= delete' विधि को उन संदर्भों से भी पहुंच योग्य बनाता है जो 'निजी' विधियां (यानी कक्षा और उसके दोस्तों के भीतर) देख सकते हैं। जब आप कोड पढ़ रहे हों तो इससे कोई अनिश्चितता दूर हो जाती है। @P्रासून, वह दूसरा उदाहरण अभी भी केवल रचनाकारों को हटा रहा है - उदाहरण के लिए हटाए गए 'ऑपरेटर लंबे() 'को देखना अच्छा लगेगा। –
यह C++ 0x मानकों में नई बात यह है कि जहां एक विरासत समारोह को नष्ट कर सकते है।
आप किसी भी फ़ंक्शन को हटा सकते हैं। E.g 'शून्य foo (int); टेम्पलेट
= 0
का अर्थ है कि एक कार्य शुद्ध वर्चुअल है और आप इस वर्ग से किसी ऑब्जेक्ट को तुरंत चालू नहीं कर सकते हैं। आपको इससे प्राप्त करने और इस विधि को लागू करने की आवश्यकता है= delete
का अर्थ है कि संकलक आपके लिए उन रचनाकारों को उत्पन्न नहीं करेगा। AFAIK यह केवल कॉपी कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर पर ही अनुमति है। लेकिन मैं आने वाले मानक में बहुत अच्छा नहीं हूं।'= delete' वाक्यविन्यास के कुछ अन्य उपयोग हैं। उदाहरण के लिए आप कॉल के साथ होने वाले कुछ प्रकार के निहित रूपांतरणों को स्पष्ट रूप से अस्वीकार करने के लिए इसका उपयोग कर सकते हैं। इसके लिए आप अधिभारित कार्यों को हटा दें। अधिक जानकारी के लिए सी ++ 0x पर विकिपीडिया पेज देखें। – LiKao
जैसे ही मुझे कुछ मिल जाएगा, मैं ऐसा करूंगा। मान लीजिए कि यह सी ++ 0 एक्स – mkaes
हाँ, सी ++ 0 एक्स चट्टानों के साथ पकड़ने का समय है। मैं जीसीसी 4.5+ के लिए अधिक आम होने की प्रतीक्षा नहीं कर सकता, इसलिए मैं लैम्बडा का उपयोग शुरू कर सकता हूं। – LiKao
नया सी ++ 0x मानक। कृपया N3242 working draft
वाह, वह मसौदा पुराना है। यहां नवीनतम (3 अप्रैल 2011 तक) है: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf – TonyK
धन्यवाद और लिंक अपडेट किया गया। वर्तमान मसौदा प्राप्त करने में बहुत मददगार। संदर्भित अनुभाग/सामग्री पुराने ड्राफ्ट में भी सही थी इसलिए मुझे नीचे वोट नहीं समझा। – dubnde
हटाया गया, अब आपने लिंक अपडेट किया है :-) – TonyK
= delete
में सेक्शन 8.4.3 देखें C++ 11 में एक सुविधा है। =delete
के अनुसार इसे उस फ़ंक्शन को कॉल करने की अनुमति नहीं दी जाएगी।
विस्तार से।
एक कक्षा में मान लीजिए।
Class ABC{
Int d;
Public:
ABC& operator= (const ABC& obj) =delete
{
}
};
ओबीजे असाइनमेंट के लिए इस फ़ंक्शन को कॉल करते समय इसे अनुमति नहीं दी जाएगी। मतलब असाइनमेंट ऑपरेटर एक ऑब्जेक्ट से दूसरे ऑब्जेक्ट में कॉपी करने के लिए प्रतिबंधित है।
से यह अंश सी ++ प्रोग्रामिंग भाषा [4 संस्करण] - Bjarne Stroustrupवास्तविक उद्देश्य के बारे में पुस्तक वार्ता =delete
का उपयोग कर के पीछे:
डिफ़ॉल्ट प्रतिलिपि का उपयोग या एक पदानुक्रम में एक वर्ग के लिए ले जाने के आम तौर पर है एक आपदा: केवल एक आधार के लिए सूचक को देखते हुए, हम बस नहीं जानता कि सदस्यों व्युत्पन्न वर्ग है (§3.2.2), तो हम पता नहीं कर सकते कि कॉपी करने के लिए उन्हें।
class Shape { public: Shape(const Shape&) =delete; // no copy operations Shape& operator=(const Shape&) =delete; Shape(Shape&&) =delete; // no move operations Shape& operator=(Shape&&) =delete; ˜Shape(); // ... };
अब एक आकार नकल करने की कोशिश पकड़ा हो जाएगा: तो, तो सबसे अच्छा होगा आमतौर पर डिफ़ॉल्ट प्रतिलिपि नष्ट करने के लिए और संचालन ले जाते हैं, वह है, के डिफ़ॉल्ट परिभाषाओं उन दो आपरेशन खत्म करने के लिए है कंपाइलर द्वारा।
=delete
तंत्र कि है, यह किसी भी आपरेशन को दबाने के लिए
इस्तेमाल किया जा सकता सामान्य है, मैं बहुत यकीन है कि नहीं मानक सी ++ ... – Blindy
कहाँ आप इस कोड को मिला है कर रहा हूँ? –
@ ब्लिंडी यह सी ++ 0x में मानक होगा, यानी जल्द ही। –