C ++ 17 उस [[nodiscard]]
विशेषता का परिचय देता है, जो प्रोग्रामर को फ़ंक्शन को इस तरह से चिह्नित करने की अनुमति देता है कि कंपाइलर चेतावनी देता है यदि एक लौटे ऑब्जेक्ट को कॉलर द्वारा त्याग दिया जाता है; एक ही विशेषता को संपूर्ण वर्ग प्रकार में जोड़ा जा सकता है।
मैंने मूल प्रस्ताव में इस विशेषता के लिए प्रेरणा के बारे में पढ़ा है , और मुझे पता है कि C ++ 20 में मानक कार्यों की विशेषता को जोड़ा जाएगा std::vector::empty
, जिनके नाम वापसी मूल्य के बारे में एक अस्पष्ट अर्थ व्यक्त नहीं करते हैं।
यह एक शांत और एक उपयोगी विशेषता है। वास्तव में, यह लगभग बहुत उपयोगी लगता है । हर जगह [[nodiscard]]
, जिनके बारे में मैंने पढ़ा है , लोग इस पर चर्चा करते हैं जैसे कि आप इसे कुछ चुनिंदा कार्यों या प्रकारों में जोड़ देंगे और बाकी के बारे में भूल जाएंगे। लेकिन एक गैर-त्याग योग्य मूल्य एक विशेष मामला क्यों होना चाहिए, खासकर जब नया कोड लिखना हो? आमतौर पर बग या संसाधनों की बर्बादी के लिए एक वापसी वापसी मूल्य नहीं है?
और सी ++ के डिजाइन सिद्धांतों में से एक ही नहीं है कि कंपाइलर को यथासंभव त्रुटियों को पकड़ना चाहिए?
यदि ऐसा है, तो [[nodiscard]]
लगभग हर एक गैर- void
फ़ंक्शन और लगभग हर एकल वर्ग प्रकार में अपने स्वयं के, गैर-विरासत कोड को क्यों नहीं जोड़ा जाए ?
मैंने अपने कोड में ऐसा करने की कोशिश की है, और यह ठीक काम करता है, सिवाय इसके कि यह बहुत बुरी तरह से क्रिया है कि यह जावा की तरह महसूस करना शुरू कर देता है। यह प्रतीत होता है और अधिक compilers बनाने के लिए प्राकृतिक डिफ़ॉल्ट रूप से खारिज कर दिया वापसी मूल्यों के बारे में चेतावनी दी है सिवाय कुछ अन्य मामलों के लिए जहां आप अपने इरादे का प्रतीक [*] ।
जैसा कि मैंने मानक प्रस्तावों, ब्लॉग प्रविष्टियों, स्टैक ओवरफ्लो प्रश्नों या इंटरनेट पर कहीं और इस संभावना के बारे में शून्य चर्चाएं देखी हैं, मुझे कुछ याद आ रहा होगा।
ऐसे मैकेनिक नए C ++ कोड में क्यों नहीं समझ पाएंगे? क्या वर्बोसिटी एकमात्र कारण नहीं है जो [[nodiscard]]
लगभग हर जगह उपयोग नहीं करता है?
[*] सिद्धांत रूप में, आपके पास [[maydiscard]]
इसके बजाय एक विशेषता जैसा कुछ हो सकता है , जो printf
मानक-पुस्तकालय कार्यान्वयन जैसे कार्यों में पूर्वव्यापी रूप से जोड़ा जा सकता है ।
const
एक अन्यथा "सरल" श्रेणी ( "सादे पुराने डेटा वस्तु" या बल्कि) ब्लोट कर सकते हैं काफी C ++।
std::vector
या std::unique_ptr
, जिनमें से आपको केवल अपनी कक्षा की परिभाषा में डेटा सदस्यों की आवश्यकता होती है। मैंने दोनों भाषाओं के साथ काम किया है; जावा एक ओकेजन भाषा है, लेकिन यह अधिक क्रिया है।
operator =
उदाहरण के लिए। औरstd::map::insert
।