क्या `कास्ट ऑटो` का कोई अर्थ है?


82

मुझे लगता है कि सवाल काफी स्पष्ट है। क्या autoकीवर्ड ऑटो-कास्ट-नेस का पता लगाएगा, या हमेशा एक गैर-कॉस्ट प्रकार को लौटाएगा, भले ही जैसे भी हों। एक फ़ंक्शन के दो संस्करण (एक जो रिटर्न करता है constऔर दूसरा जो नहीं करता है)।

सिर्फ रिकॉर्ड के लिए, मैं const auto end = some_container.end()अपने फॉर-लूप्स से पहले उपयोग करता हूं, लेकिन मुझे नहीं पता कि यह आवश्यक है या सामान्य से अलग भी है auto

जवाबों:


31

शायद आप भ्रमित कर रहे हैं const_iteratorऔर const iterator। पहला एक कांस्टेबल तत्वों से अधिक पुनरावृत्त होता है, दूसरा वह बिल्कुल भी पुनरावृति नहीं कर सकता क्योंकि आप operatorsउस पर ++ और - का उपयोग नहीं कर सकते हैं ।

ध्यान दें कि आप शायद ही कभी से पुनरावृति container.end()। आमतौर पर आप उपयोग करेंगे:

const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }

12
cbeginऔर cendएक const_iteratorमूल्य से वापस आ जाओ । const autoअभी भी इसका उद्देश्य है और यह बेमानी नहीं है।
dalle

2
तो const autoइस सामान्य मामले में उपयोगी है?
रुबनेव

@ डेली: आपने टिप्पणी करने से पहले मैंने अपना पैराग्राफ हटा दिया था, महसूस किया था कि मैंने सिर्फ निरर्थक बातें कही थी :)
बेनोइट

2
किसी का बहुत अधिक वर्ग लिख रहा है। :)
एंड्रेस जान टैक

3
ऑटो को कास्ट
Janosimas

97
const auto x = expr;

से भिन्न है

auto x = expr;

जैसा

const X x = expr;

से भिन्न है

X x = expr;

तो उपयोग करें const autoऔर const auto&बहुत कुछ, जैसे आप करेंगे अगर आपके पास नहीं था auto

अधिभार रिज़ॉल्यूशन रिटर्न प्रकार से प्रभावित नहीं होता है: constया constअंतराल पर कोई xभी प्रभावित नहीं करता है कि कार्यों को क्या कहा जाता है expr


17
यदि आप चर को संशोधित नहीं कर रहे हैं (या माना जा रहा है), तो इसे घोषित किया जाना चाहिए const
पॉल जे। लुकास

7

विचार करें कि आपके पास दो टेम्पलेट हैं:

template<class U> void f1( U& u );       // 1
template<class U> void f2( const U& u ); // 2

autoप्रकार में कटौती करेगा और चर में पैरामीटर के समान प्रकार होगा u(जैसा कि // 1मामले में), const autoचर को उसी प्रकार का बना देगा जैसा कि पैरामीटर uके // 2मामले में है। तो const autoसिर्फ constक्वालिफ़ायर बल ।


3

कंपाइलर ऑटो क्वालिफायर के लिए टाइप को घटाता है। यदि एक घटा हुआ प्रकार है some_type, में const autoपरिवर्तित कर दिया जाएगा const some_type। हालांकि, एक अच्छा संकलक autoचर के पूरे दायरे की जांच करेगा और यह पता लगाएगा कि क्या इसका मूल्य कहीं भी बदलता है। यदि नहीं, संकलक ही इस तरह के प्रकार निकालना होगा: auto-> const some_type। मैंने विजुअल स्टूडियो एक्सप्रेस 2012 में यह कोशिश की है और उत्पादित मशीन कोड दोनों ही मामलों में समान है, मुझे यकीन नहीं है कि प्रत्येक और हर कंपाइलर ऐसा करेगा। लेकिन, const autoतीन कारणों से उपयोग करना एक अच्छा अभ्यास है :

  • कोडिंग त्रुटियों को रोकना। आपने इस चर को बदलने के लिए नहीं बल्कि किसी तरह इसके दायरे में आने के उद्देश्य से इसे बदला है।
  • कोड पठनीयता में सुधार हुआ है।
  • यदि आप किसी कारण से इसके constलिए कटौती नहीं करते हैं तो आप कंपाइलर की मदद करते हैं auto

कंपाइलर कास्ट को कम नहीं करेगा यदि यह संभव है ... यह केवल कॉन्स को जोड़ेगा यदि यह जिस प्रकार का है वह एक्सप्रेशन कर रहा है जो पहले से ही कॉन्स्टेबल है। यदि कोई कंपाइलर संभव होने के लिए केवल कास्ट जोड़ देगा, तो प्रोग्राम शब्दार्थ को तोड़ा जा सकता है, जैसे कि कॉन्स्ट बनाम नॉन-कास्ट मेंबर फंक्शन को कॉल किया जा सकता है, यह इस बात पर निर्भर करता है कि क्या विशेष कंपाइलर कॉन्स को कम कर सकता है या नहीं। इसलिए मुझे लगता है कि आपका अंतिम बिंदु गलत है।
रुबनेव

@rubenvb C ++ मानक कंपाइलरों को वांछित अनुकूलन के आधार पर कोड को पुनर्गठित करने की अनुमति देते हैं। यह पूरी तरह से कानूनी एक संकलक निकालना के लिए है constके लिए auto अगर यह किसी भी तरह से प्रोग्राम कार्यक्षमता बदल नहीं है । इसमें यह भी शामिल है कि क्या कांस्ट और नॉन-कास्ट मेंबर फंक्शन उपलब्ध हैं। कंपाइलर इसे सही करेगा।
BJovke डेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.