2014-10-08 8 views
5

पर किसी भी कंपाइलर झंडे को लागू करने के लिए कोई कंपाइलर झंडे हैं, तो अंतर्निहित परिभाषित प्रति कन्स्ट्रक्टर पीढ़ी को अक्षम कैसे करें?उपयोगकर्ता परिभाषित विनाशक

टी के उपयोगकर्ता परिभाषित प्रतिद्वंद्वी या उपयोगकर्ता द्वारा परिभाषित प्रति असाइनमेंट ऑपरेटर होने पर अंतर्निहित परिभाषित प्रतिलिपि निर्माता की पीढ़ी को बहिष्कृत किया जाता है।

परोक्ष परिभाषित प्रति असाइनमेंट ऑपरेटर की पीढ़ी पदावनत है (के बाद से सी ++ 11) अगर टी एक उपयोगकर्ता के घोषित नाशक या उपयोगकर्ता के घोषित प्रतिलिपि निर्माता है।

मैं क्लैंग, विजुअल स्टूडियो 2013 या जीसीसी में नियमों को लागू करने में रूचि रखता हूं क्योंकि कोडबेस को उन सभी के साथ संकलित किया जाएगा।

struct W { 
    int a; 
    ~W() { a = 9; } 
}; 

int main() { 
W w {}; 
W v = w; 
} 

Johnathan Wakely की टिप्पणी का संदर्भ लें:

+0

तुम बस 'noncopyable' से विरासत सकता है: http: //www.boost.org/doc/libs/1_55_0/libs/utility/utility.htm#Class_noncopyable – EdChum

+0

वी.एस. के लिए आप को सक्रिय कर सकता है" चेतावनी-जैसे- त्रुटियां " –

+0

@ मार्कोए। क्या यह एक चेतावनी है? किस संस्करण में और किस चेतावनी स्तर पर? – Felics

उत्तर

5

यह bug report इस परीक्षण का मामला जो जीसीसी में एक चेतावनी उत्सर्जन नहीं उल्लेख

सच नहीं है यही कारण है, संकलक (और करता है) कानूनी कोड के बारे में चेतावनी दीजिए।

मैं इस बात की पुष्टि कर रहा हूँ, हम कुछ बिंदु पर चेतावनी चाहते हैं, और यह हमें -Weffc++ चेतावनी के इस हिस्से में सुधार करने की अनुमति होगी:

* मद 11: एक प्रति निर्माता और एक असाइनमेंट ऑपरेटर को परिभाषित करें गतिशील आवंटित स्मृति वाले वर्गों के लिए।

(अधिक जानकारी के लिए PR 16166 देखें)

हो सकता है कि हमने इस चेतावनी -Wdeprecated-special-members कह सकते हैं, और यह -Weffc++ सक्षम है और में सी ++ 11 भी -Wdeprecated

बजना द्वारा पहले से ही इस बारे में चेतावनी देते है -Wdeprecated:

main.cpp:3:3: warning: definition of implicit copy constructor for 'W' is deprecated because it has a user-declared destructor [-Wdeprecated] 

    ~W() { a = 9; } 

^

main.cpp:8:8: note: implicit copy constructor for 'W' first required here 

W v = w; 

Microsoft स्पष्ट रूप से कहा गया है कि दृश्य स्टूडियो इस मामले में एक चेतावनी उत्सर्जन नहीं होगा:

इसके अतिरिक्त, सी ++ 11 मानक निम्न अतिरिक्त नियम निर्दिष्ट करता है:

  • एक प्रति निर्माता या नाशक है स्पष्ट रूप से घोषित किया गया है, तो कॉपी-असाइनमेंट ऑपरेटर की स्वचालित पीढ़ी को बहिष्कृत किया गया है।

  • यदि एक कॉपी-असाइनमेंट ऑपरेटर या विनाशक स्पष्ट रूप से घोषित किया गया है, तो कॉपी कन्स्ट्रक्टर की स्वचालित पीढ़ी को बहिष्कृत कर दिया गया है।

दोनों मामलों में, दृश्य स्टूडियो स्वचालित रूप से परोक्ष आवश्यक कार्यों उत्पन्न करने के लिए जारी है, और एक चेतावनी उत्सर्जन नहीं करेगा।

+1

-Wdeprecated मेरे लिए काफी अच्छा है। मुझे पहले से ही त्रुटियों के रूप में चेतावनियां हैं :) – Felics

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