2010-05-20 12 views
5

कार्यकारी ड्राफ्ट स्पष्ट रूप से कॉल करता है कि डिफॉल्ट-फ़ंक्शंस विशेष सदस्य फ़ंक्शंस (जैसे कॉपी-कन्स्ट्रक्टर, डिफ़ॉल्ट-कन्स्ट्रक्टर, आदि, (§8.4.2.1-1) होना चाहिए। जो सही समझ में आता है।क्या कोई फ़ंक्शन हटाए गए फ़ंक्शन हो सकता है?

हालांकि, मुझे हटाए गए कार्यों पर कोई प्रतिबंध नहीं दिख रहा है (§8.4.3)। क्या वह सही है?

या दूसरे शब्दों में ये तीन उदाहरण मान्य हैं c++0?

struct Foo 
{ 
    // 1 
    int bar(int) = delete; 
}; 


// 2 
int baz(int) = delete; 


template< typename T > 
int boo(T t); 

// 3 
template<> 
int boo<int>(int t) = delete; 
+1

हटाए गए फ़ंक्शन को भी क्या है? – Puppy

+1

एक हटाया गया कार्य वह है जो अस्तित्व में था अगर इसे हटाया नहीं गया था। जैसे आप क्लास कॉपी सीटीओआर को हटा सकते हैं। यह दो कारणों से निजी अनुपूरक बनाने के लिए थोड़ा बेहतर है। 1. कोड और 2 पढ़ते समय यह अधिक स्पष्ट है। आप एक स्पष्ट त्रुटि संदेश प्राप्त कर सकते हैं। – MSalters

+2

@MSalters: आप उन कार्यों को भी हटा सकते हैं जो मौजूद नहीं हैं, उनके उपयोग को रोकते हैं। जैसे दिया गया 'शून्य एफ (डबल); शून्य एफ (int) = हटाएं; ', एफ (42) अब निहित रूपांतरण का उपयोग करने के बजाय एक त्रुटि है। –

उत्तर

4

सी ++ 0x spec (§ [dcl.fct.def.delete]) ऐसी संरचनाओं से इंकार नहीं करता है, और जी ++ 4.5 उनमें से सभी को पहचानता है।

x.cpp: In function 'int main()': 
x.cpp:4:8: error: deleted function 'int Foo::bar(int)' 
x.cpp:21:11: error: used here 
x.cpp:9:5: error: deleted function 'int baz(int)' 
x.cpp:22:2: error: used here 
x.cpp:9:5: error: deleted function 'int baz(int)' 
x.cpp:22:8: error: used here 
x.cpp:17:5: error: deleted function 'int boo(T) [with T = int]' 
x.cpp:23:7: error: used here 
-3

मैं क्या "हटाए गए" सदस्य कार्यों की परिभाषा से समझ में से, कि यह केवल विशेष सदस्य कार्य (निर्माता, कॉपी, असाइनमेंट) कि साधारण सदस्य के लिए संकलक द्वारा स्वचालित रूप से बनाया जा सकता है और नहीं के लिए लागू होता है फ़ंक्शंस (जो सभी आईएमओ में "हटाए गए" कार्यों को घोषित करने के लिए कोई समझ नहीं आता है, इसलिए उन्हें वैसे भी घोषित न करें)

+1

इसका उपयोग किसी भी फ़ंक्शन के लिए किया जा सकता है जिसमें डिफ़ॉल्ट है। उदाहरण के लिए, प्रचार को अक्षम करने के लिए। – a1ex07

4

मुझे लगता है कि वे ठीक हैं।

= delete एक अधिभार का उपयोग नहीं किया जाता है (§8.4.3/2), जो कक्षाओं के बाहर उपयोगी है।

अब 5 महीने बाद मैं अन्य उत्तरों को देखता हूं ... delete न केवल अंतर्निहित परिभाषाओं के कार्यों के लिए उपयोगी है। यह एक टिप्पणी का साफ विकल्प है कि "कोई कार्यान्वयन नहीं - इसका उपयोग एक लिंकर त्रुटि है।" यह कुछ लागू करने के लिए एक स्पष्ट तरीका प्रदान करता है, उदाहरण के लिए एक आधार टेम्पलेट जहां केवल स्पष्ट विशेषज्ञता वास्तव में मौजूद होगी। संकलक लिंक समय से पहले शिकायत करेगा।

एक थोड़ा अजीब है, लेकिन पूरी तरह से उचित उदाहरण के लिए,

class abc { 
protected: 
    inline virtual ~abc() = 0; 
    inline virtual void do_something() = 0; 
}; 

abc::~abc() {} 
void abc::do_something = delete; 

दोनों = 0 पर विचार करने और = delete एक ही समारोह पर इस्तेमाल किया जा सकता। = delete के बिना, उपयोगकर्ता abc::do_something() पर एक आकस्मिक सौजन्य कॉल दे सकता है।

मुझे आश्चर्य नहीं होगा अगर सी ++ 0x के बाद सी ++ के अगले पुनरावृत्ति स्पष्ट रूप से हटाए गए वर्ग जोड़ता है।

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