2011-04-01 17 views
162
class my_class 
{ 
    ... 
    my_class(my_class const &) = delete; 
    ... 
}; 

= delete उस संदर्भ में क्या अर्थ है?कार्य घोषणा के बाद = हटाएं

क्या कोई अन्य "संशोधक" है (= 0 और = delete के अलावा)?

+7

इस्तेमाल किया जा सकता सामान्य है, मैं बहुत यकीन है कि नहीं मानक सी ++ ... – Blindy

+0

कहाँ आप इस कोड को मिला है कर रहा हूँ? –

+19

@ ब्लिंडी यह सी ++ 0x में मानक होगा, यानी जल्द ही। –

उत्तर

130

एक समारोह को हटाया जा रहा 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 
}; 
+0

कॉपी-सीटीओआर और ऑपरेटर = "निजी" बनाने के लिए "कॉपी करने पर रोक लगाने" की पारंपरिक विधि नहीं है? यह थोड़ा आगे जाता है और संकलक को भी उत्पन्न करने के लिए संकलक को निर्देश देता है। यदि वे दोनों निजी हैं और = हटाते हैं, तो दोबारा निषिद्ध है? –

+2

@Reb, '= delete' विधि को उन संदर्भों से भी पहुंच योग्य बनाता है जो 'निजी' विधियां (यानी कक्षा और उसके दोस्तों के भीतर) देख सकते हैं। जब आप कोड पढ़ रहे हों तो इससे कोई अनिश्चितता दूर हो जाती है। @P्रासून, वह दूसरा उदाहरण अभी भी केवल रचनाकारों को हटा रहा है - उदाहरण के लिए हटाए गए 'ऑपरेटर लंबे() 'को देखना अच्छा लगेगा। –

0

यह C++ 0x मानकों में नई बात यह है कि जहां एक विरासत समारोह को नष्ट कर सकते है।

+8

आप किसी भी फ़ंक्शन को हटा सकते हैं। E.g 'शून्य foo (int); टेम्पलेट शून्य foo (टी) = हटाएं; 'सभी अंतर्निहित रूपांतरण रोकता है। 'Int' प्रकार के केवल तर्क स्वीकार किए जाते हैं, अन्य सभी "हटाए गए" फ़ंक्शन को तुरंत चालू करने का प्रयास करेंगे। – UncleBens

58
  1. = 0 का अर्थ है कि एक कार्य शुद्ध वर्चुअल है और आप इस वर्ग से किसी ऑब्जेक्ट को तुरंत चालू नहीं कर सकते हैं। आपको इससे प्राप्त करने और इस विधि को लागू करने की आवश्यकता है
  2. = delete का अर्थ है कि संकलक आपके लिए उन रचनाकारों को उत्पन्न नहीं करेगा। AFAIK यह केवल कॉपी कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर पर ही अनुमति है। लेकिन मैं आने वाले मानक में बहुत अच्छा नहीं हूं।
+3

'= delete' वाक्यविन्यास के कुछ अन्य उपयोग हैं। उदाहरण के लिए आप कॉल के साथ होने वाले कुछ प्रकार के निहित रूपांतरणों को स्पष्ट रूप से अस्वीकार करने के लिए इसका उपयोग कर सकते हैं। इसके लिए आप अधिभारित कार्यों को हटा दें। अधिक जानकारी के लिए सी ++ 0x पर विकिपीडिया पेज देखें। – LiKao

+0

जैसे ही मुझे कुछ मिल जाएगा, मैं ऐसा करूंगा। मान लीजिए कि यह सी ++ 0 एक्स – mkaes

+0

हाँ, सी ++ 0 एक्स चट्टानों के साथ पकड़ने का समय है। मैं जीसीसी 4.5+ के लिए अधिक आम होने की प्रतीक्षा नहीं कर सकता, इसलिए मैं लैम्बडा का उपयोग शुरू कर सकता हूं। – LiKao

1

नया सी ++ 0x मानक। कृपया N3242 working draft

+0

वाह, वह मसौदा पुराना है। यहां नवीनतम (3 अप्रैल 2011 तक) है: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf – TonyK

+0

धन्यवाद और लिंक अपडेट किया गया। वर्तमान मसौदा प्राप्त करने में बहुत मददगार। संदर्भित अनुभाग/सामग्री पुराने ड्राफ्ट में भी सही थी इसलिए मुझे नीचे वोट नहीं समझा। – dubnde

+0

हटाया गया, अब आपने लिंक अपडेट किया है :-) – TonyK

1

= delete में सेक्शन 8.4.3 देखें C++ 11 में एक सुविधा है। =delete के अनुसार इसे उस फ़ंक्शन को कॉल करने की अनुमति नहीं दी जाएगी।

विस्तार से।

एक कक्षा में मान लीजिए।

Class ABC{ 
Int d; 
Public: 
    ABC& operator= (const ABC& obj) =delete 
    { 

    } 
}; 

ओबीजे असाइनमेंट के लिए इस फ़ंक्शन को कॉल करते समय इसे अनुमति नहीं दी जाएगी। मतलब असाइनमेंट ऑपरेटर एक ऑब्जेक्ट से दूसरे ऑब्जेक्ट में कॉपी करने के लिए प्रतिबंधित है।

3

से यह अंश सी ++ प्रोग्रामिंग भाषा [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 तंत्र कि है, यह किसी भी आपरेशन को दबाने के लिए

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