स्कॉट मेयर की किताब प्रभावी आधुनिक C++ में हम, पढ़ सकते हैं कि:ऑटो और static_casts - अच्छा अभ्यास
std::vector<bool> features(const Widget& w);
Widget w;
…
bool highPriority = features(w)[5];
…
processWidget(w, highPriority);
और ऑटो के साथ एक विकल्प
auto highPriority = features(w)[5];
जो वजह से, अपरिभाषित व्यवहार का कारण बनता है तथ्य यह है कि features()
std::vector<bool>
लौटा रहा है, जो opearator[]
से मान लौटाते समय प्रॉक्सी ऑब्जेक्ट प्रकार std::vector<bool>::reference
का उपयोग करता है।
इस समाधान के लिए auto
का उपयोग न करने की सलाह दी जाती है, लेकिन static_casts
का उपयोग करना बंद नहीं किया जाता है।
तो स्कॉट Meyers सलाह उपयोग करने के लिए:
auto highPriority = static_cast<bool>(features(w)[5]);
के बजाय:
bool highPriority = features(w)[5];
मेरा प्रश्न है: उन दोनों के बीच कोई वास्तविक अंतर क्या है? मेरी राय में दोनों एक जैसे हैं, क्योंकि दोनों विधियां बिल्कुल वैसे ही कड़ी मेहनत कर रही हैं (फ़ंक्शन फीचर्स में रिटर्न वैल्यू टाइप बदलना चरम उच्च प्राथमिकता को एक अलग प्रकार नहीं बनाता है) और दूसरा लिखने के लिए छोटा है।
बस एक संदेह है, लेकिन मेरे सिर के ऊपर से मैं एक कार्यात्मक अंतर के बारे में नहीं सोच सकता, और स्कॉट का एकमात्र कारण स्थिरता हो सकता है - क्या उसने उसी पुस्तक में कहीं भी व्यावहारिक सब कुछ के लिए 'ऑटो x = 'का उपयोग करने की वकालत नहीं की है ...? (या शायद यह कुछ ऑनलाइन आलेख मैंने देखा था ...) –
@ टोनीड हाँ, स्थिरता शायद कारण है। वह सुझाव देता है कि "आइटम 5 – TartanLlama
में स्पष्ट प्रकार की घोषणाओं को" ऑटो 'पसंद करें "मैं कहूंगा कि पहला समाधान स्पष्ट रूप से पाठक को बताता है" यह बात एक बूल नहीं है, लेकिन मैं इसे एक बूल बनना चाहता हूं "। दूसरा समाधान आमतौर पर पाठक को बताता है "यह एक बूल है या कम से कम इस तरह इस्तेमाल किया जा सकता है" लेकिन समस्या यह है कि अधिकांश पाठक इसे "एक बूल" के रूप में पढ़ते हैं और शायद "हे, अब हमारे पास 'ऑटो' है, इसलिए हम इसे 'ऑटो उच्च प्राथमिकता = विशेषताएं (डब्ल्यू) [5];'! ", और बूम लिखते हैं। यहां तक कि यदि दोनों समाधान तकनीकी रूप से समान हैं, तो पाठक को पहले चेतावनी दी जाती है कि 'सुविधाओं (डब्ल्यू) [5]' का उपयोग करने में कोई समस्या हो सकती है। वैसे, वही समस्या अभिव्यक्ति टेम्पलेट्स जैसी चीजों के साथ होती है। – leemes