C ++ 11 में ऑटो कीवर्ड की प्रेरणा और नुकसान (?)


20

मैं हाल ही में सोच रहा था कि autoएक चर को चिह्नित करने के लिए कीवर्ड को C ++ 11 में क्यों चुना गया था जिसका प्रकार कंपाइलर द्वारा अनुमानित होना चाहिए, जैसे

auto x = 1;

जबसे

  1. var अन्य प्रोग्रामिंग भाषाओं (जैसे C #, स्काला, जावास्क्रिप्ट), और में अधिक सामान्य लगता है
  2. जहां तक ​​मैं autoब्रेक बैकवर्ड कम्पैटिबिलिटी के नए शब्दार्थ को समझता हूं (इसका उपयोग शायद ही कभी किया गया था लेकिन C ++ के पिछले संशोधनों में एक अलग अर्थ था, उदाहरण के लिए यहां देखें )

मैं पूछना चाहता था कि क्या चुनने का कोई विशेष कारण था auto( varकिसी या अन्य कीवर्ड के पक्ष में )। C ++ 11 मानक जारी होने से पहले क्या इस मुद्दे के बारे में कोई विशेष चर्चा हुई थी?

इसके अलावा, क्या हमें सी ++ 11 कंपाइलर के साथ विरासत सी + + कोड को फिर से जमा करते समय कोई संभावित असंगतताएं दिखनी चाहिए?


9
नया शब्दार्थ autoपीछे की अनुकूलता को तोड़ सकता है, लेकिन, इस बात पर निर्भर करता है कि पूर्व -11 कोड में varकितनी बार autoकीवर्ड का उपयोग किया गया है , की तुलना में एक चर नाम के रूप में कितनी बार उपयोग किया जाता है, समिति ने शायद यह माना है कि यह एक नया परिचय देने की तुलना में कम नाटकीय रूप से संगतता को तोड़ता है कीवर्ड होगा।
sepp2k

2
"जैसा कि वर्तमान में खड़ा है, यह प्रश्न हमारे प्रश्नोत्तर प्रारूप के लिए एक अच्छा फिट नहीं है। हम तथ्यों, संदर्भों या विशिष्ट विशेषज्ञता द्वारा समर्थित उत्तर की उम्मीद करते हैं, लेकिन इस प्रश्न की विवेचना बहस, तर्क, मतदान या विस्तारित चर्चा की संभावना होगी। यदि आपको लगता है कि इस प्रश्न को बेहतर बनाया जा सकता है और संभवतः फिर से खोला जा सकता है, मार्गदर्शन के लिए अक्सर पूछे जाने वाले प्रश्न देखें। ": यह प्रश्न एक तथ्य के बारे में पूछ रहा है: क्या इस विषय पर चर्चा हुई थी। दो संभावित उत्तर हैं: हाँ और नहीं।
जियोर्जियो

2
बेशक एक चर्चा थी, जो इस संबंध में प्रश्न को निरर्थक बनाती है। autoबनाम varसवाल कि आपका टेक्स्ट के 90% के लिए संदर्भित करता है, और उस सवाल का कोई निश्चित परिणाम है। (हालांकि मैं वह नहीं हूं जिसने वोट देने के लिए बंद किया है)
तेलस्तीन

1
@ टेलस्टाइन: अगर मुझे पता होता कि इस विषय पर चर्चा होती तो मैं नहीं पूछता। "ऑटो बनाम var C ++" या "auto C ++" के लिए Googling ने इस विषय पर कुछ भी नहीं दिया।
जियोर्जियो

1
autoC ++ varमें पेश किए जाने से पहले C ++ के लिए प्रस्तावित किया गया था, इसलिए सवाल यह होना चाहिए कि C # ऑटो का उपयोग क्यों नहीं करता है। var का एक अलग अर्थ है जावास्क्रिप्ट और स्काला
एड्रिनम

जवाबों:


37

लगभग हर शब्द जिसे आप एक भाषा के लिए एक खोजशब्द के रूप में जोड़ने के बारे में सोच सकते हैं, लगभग निश्चित रूप से एक चर नाम या काम करने वाले कोड के कुछ अन्य भाग के रूप में उपयोग किया गया है। यदि आपने उस शब्द को कीवर्ड बना दिया है तो यह कोड टूट जाएगा।

अविश्वसनीय रूप से भाग्यशाली बात autoयह है कि यह पहले से ही एक कीवर्ड था, इसलिए लोगों के पास उस नाम के साथ चर नहीं थे, लेकिन किसी ने इसका इस्तेमाल नहीं किया, क्योंकि यह डिफ़ॉल्ट था। क्यों टाइप करें:

auto int i=0;

कब

int i=0;

वास्तव में एक ही बात का मतलब है?

मुझे लगता है कि ग्रह पर कहीं कोड की कुछ छोटी मात्रा थी जो पुराने तरीके से 'ऑटो' का इस्तेमाल करती थी। लेकिन 'ऑटो' को हटाकर इसे ठीक किया जा सकता था और यह फिर से काम कर रहा होगा। इसलिए यह कीवर्ड को पुन: पेश करने के लिए एक बहुत स्पष्ट विकल्प था।

मुझे लगता है कि यह एक स्पष्ट अर्थ है। यदि आपने वेरिएंट के साथ काम किया है और इस तरह, जब आप देखते हैं varतो आप सोच सकते हैं कि घोषणा किसी तरह से कम दृढ़ता से टाइप की गई है यदि आपने कीबोर्ड पर सभी कुंजी को स्वयं टाइप किया है ताकि वेरिएबल के प्रकार को निर्दिष्ट किया जा सके। मेरे लिए, autoयह स्पष्ट करता है कि आप कंपाइलर को स्वचालित रूप से टाइप करने के लिए कह रहे हैं, जो कि उतना ही मजबूत है जितना कि आपने इसे स्वयं निर्दिष्ट किया है। तो यह वास्तव में एक बहुत ही भाग्यशाली ब्रेक था जिसने समिति को एक अच्छा नाम उपलब्ध कराया।

(छोटा) ब्रेकिंग को स्पष्ट करने के लिए:

अगर आप के पास था

auto int i=0;

और C ++ 11 संकलक के साथ संकलन करने की कोशिश की, अब आपको एक त्रुटि मिलेगी जैसे

C3530 त्रुटि: 'ऑटो' को किसी अन्य प्रकार-विशेष के साथ जोड़ा नहीं जा सकता है

यह तुच्छ है, आप बस या तो ऑटो को हटा दें और फिर से खोलें।

हालांकि एक बड़ी समस्या है। अगर आप के पास था

auto i = 4.3;

C और वास्तव में पुराना C ++ iएक बना देगा int(जैसा कि यदि आप छोड़ देते हैं auto- डिफ़ॉल्ट घोषणा थी int)। यदि आप इस कोड को संकलित किए बिना वास्तव में लंबे समय से चले गए हैं, या पुराने संकलक का उपयोग कर रहे हैं, तो आप कम से कम सिद्धांत में इस कोड में से कुछ हो सकते हैं। C ++ 11 इसे बनाता है doubleक्योंकि यह 4.3 है। (या शायद ए float, मैं अभी भी बॉक्सिंग डे मोड में हूं, लेकिन बिंदु एक नहीं है int।) यह आपके ऐप में सूक्ष्म कीड़े को पेश कर सकता है। और संकलक से किसी भी चेतावनी या त्रुटियों के बिना। इस नाव में लोगों को यह autoसुनिश्चित करने के लिए ग्लोबली सर्च करना चाहिए कि वे C ++ 11 कंपाइलर में जाने से पहले इसका पुराना इस्तेमाल नहीं कर रहे थे। सौभाग्य से, ऐसा कोड अत्यंत दुर्लभ है।


बहुत स्पष्ट उत्तर के लिए धन्यवाद। +1 मैं ज्यादातर हानिरहित तरीके से पिछड़ी अनुकूलता को छोड़ने के बीच व्यापार-बंद को समझता हूं और एक बड़ा मौका है कि नए कीवर्ड द्वारा पुराने कोड को नहीं तोड़ा जाता है।
जियोर्जियो

क्या वास्तव में कोई असंगति है? C ++ 11 संकलक को अनदेखा नहीं करेंगे autoयदि यह एक प्रकार के नाम के बाद होता है?
आआआआआआआआआआ आआआआआ

1
विजुअल C ++ 2012 error C3530: 'auto' cannot be combined with any other type-specifierउस लाइन के लिए कहता है
केट ग्रेगरी

3
@ केटग्रेरी: दरअसल, इसमें कोई समस्या नहीं है auto i = 4.3;, क्योंकि यह C ++ 03 / C ++ 98 में बीमार था। सी ++ था नहीं 'निहित पूर्णांक' नियम पर ले कि C89 था (और C99 संशोधन में गिरा दिया)।
बार्ट वैन इनगेन शानौ

1
@ केट ग्रेगरी: यदि आप बार्ट की टिप्पणियों को ध्यान में रख सकते हैं और अपना उत्तर बदल सकते हैं तो मैं इसे स्वीकृत उत्तर के रूप में चिह्नित करूंगा।
जियोर्जियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.