C ++: const संदर्भ, प्रकार-विनिर्देशक के बाद बनाम


144

तर्कों में क्या अंतर है:

int foo1(const Fred &arg) {
...
}

तथा

int foo2(Fred const &arg) {
...
}

? मैं इस मामले को पैरशफ्ट एफएक्यू में शामिल नहीं देखता।



2
क्या यह शैली के बारे में एक प्रश्न है? "कॉन्स्ट फ्रेड" अंग्रेजी में अच्छा लगता है, लेकिन "फ्रेड कास्ट" मुझे बेहतर लगता है।
लातिनसुद

1
संबंधित नोट पर, क्या कोई कारण है जिसे Fred const &argअधिक पसंद किया जाना चाहिए Fred const& arg? मुझे उत्तरार्द्ध बेहतर पसंद है क्योंकि const&एक इकाई है जिसका अर्थ है "कॉन्स्ट्रे", और नाम argसभी प्रकार के विनिर्देशक से एक रिक्त द्वारा अलग किया गया है।
फ्रैंक

4
@ वर्धमान: लेकिन int const& ref' कास्ट रेफरी' का मतलब यह नहीं है, लेकिन ' कॉस्ट टू कॉन्स्ट'।
सेड्रिक एच।

जवाबों:


112

कांस्ट के रूप में कोई अंतर नहीं पढ़ा जाता है और दायें-से-बाएँ को सम्मान के साथ पढ़ा जाता है, इसलिए दोनों एक अपरिवर्तनीय फ्रेड उदाहरण के संदर्भ का प्रतिनिधित्व करते हैं।

Fred& constइसका अर्थ यह होगा कि संदर्भ अपरिवर्तनीय है, जो निरर्थक है ; जब दोनों कांस्टरों के साथ काम करते हैं Fred const*और Fred* constमान्य होते हैं लेकिन अलग होते हैं।

यह शैली की बात है, लेकिन मैं constएक प्रत्यय के रूप में उपयोग करना पसंद करता हूं क्योंकि इसे लगातार सदस्य कार्यों सहित लागू किया जा सकता है ।


फिर बनाने के लिए एक बिंदु क्या है std::is_const<const T&>::valueहो false?
abyss.7

@ abyss.7 यह एक संदर्भ है const T; संदर्भ परस्पर है।
सीन फॉसेट

125

व्यवहार

के बीच कोई अर्थ अंतर नहीं है const T&और T const&; भाषा उन्हें उसी प्रकार का मानती है। (यही बात लागू होती है const T*और T const*)

शैली की बात के रूप में

जिसके बारे में आपको स्टाइलिस्टिक रूप से पसंद करना चाहिए, हालाँकि, मैं बहुत सारे अन्य उत्तरों से अलग हो जाऊंगा और const T&(और const T*) पसंद करूँगा :

  • const T&स्ट्रोस्ट्रुप की द C ++ प्रोग्रामिंग लैंग्वेज बुक में प्रयुक्त शैली है ।
  • const T& वह शैली है जिसका उपयोग C ++ मानक में ही किया जाता है।
  • const T*K & R की द C प्रोग्रामिंग लैंग्वेज बुक में प्रयुक्त शैली है ।
  • const T* C मानक में प्रयुक्त शैली है।
  • ऊपर कारकों के कारण, मुझे लगता है कि const T&/ const T*से रास्ता अधिक जड़ता है T const&/ T const*const T&/ const T*अनुभव तरह से अधिक मेरे लिए आम की तुलना में लग रहे हैं T const&/ T const*सी ++ और सी कोड के सभी में है कि मैंने देखा है। मुझे लगता है कि सामान्य प्रथाओं का पालन करना दायीं ओर से बायीं ओर के पार्सिंग नियमों का पालन करने की तुलना में अधिक पठनीय है।
  • साथ T const*यह गुम हो करने के लिए आसान लगता है, *के रूप में T* const(विशेष रूप से अगर लोग के रूप में यह करने के लिए अभ्यस्त नहीं हैं)। इसके विपरीत, const* Tकानूनी वाक्यविन्यास नहीं है।

दाएँ-से-बाएँ पार्सिंग नियम के बारे में क्या?

संपूर्ण दाएँ-से-बाएँ पार्सिंग तर्क के बारे में, जिसका उपयोग करना लोगों को अच्छा लगता है: जैसा कि मैंने एक अन्य उत्तर में एक टिप्पणी में उल्लेख किया है, const T&ठीक दाएं-बाएं भी पढ़ता है। यह एक T स्थिरांक का संदर्भ है। "टी" और "स्थिर" प्रत्येक एक विशेषण या संज्ञा के रूप में काम कर सकते हैं। (इसके अतिरिक्त, T const*राइट-टू-लेफ्ट पढ़ना अस्पष्ट हो सकता है क्योंकि इसे गलत तरीके से "पॉइंटर कंटीन्यू टू टी" के बजाय "पॉइंटर टू कंटीनेंट टी" कहा जा सकता है।)


3
+1, सहमत। यदि कोड को पढ़ना आसान है तो एक कॉन्स्ट को स्पॉट करना आसान है यदि लाइन कॉन्स से शुरू होती है। दाएं-बाएं नियम वास्तव में केवल तब आवश्यक होते हैं जब विशेष रूप से बालों के प्रकार की घोषणाओं को मैन्युअल रूप से पार्स किया जाता है। सबसे आम मामले के लिए अनुकूलन क्यों नहीं? इसके अलावा, यदि आप टाइप घोषणाएँ लिखते हैं तो IMHO इसलिए आपको मैन्युअल रूप से अपने सिर में FSM चलाने की आवश्यकता है जो आप गलत कर रहे हैं।
एंड्रियास मैग्यूसन 11

2
-1। भले ही आपका निष्कर्ष कितना न्यायसंगत हो और मैं व्यक्तिगत रूप से उनसे कितना सहमत हूं, वे सीधे पूछे गए सवाल का जवाब नहीं दे रहे हैं। यह एक सरल प्रश्न का दूसरा-सबसे उत्तर देता है जैसे कि कुछ गंदे पानी के नीचे की मशीनरी के बारे में ऑफ-टॉपिक गिब्रिश, जिसमें कोई निष्कर्ष नहीं है, कोई प्रत्यक्ष उत्तर नहीं है - कुछ भी नहीं। जब आप एक सरल स्पष्ट सारांश जोड़ते हैं, तो आपको मेरा उत्थान मिलेगा " नहीं, दोनों वाक्यविन्यासों के बीच कोई शब्दार्थ अंतर नहीं है , लेकिन कुछ स्टाइलिश विचार इस प्रकार हैं ..."। और तभी उन सभी गोलियों।
ulidtko

1
IMO कारण को const T&बेहतर ढंग से पढ़ता है, वह है: 1- हम कोड को बाएं से दाएं पढ़ते हैं। और 2- एक नई अवधारणा का वर्णन करते समय हम सामान्य अवधारणा से अधिक विशिष्ट तक शुरू करते हैं। यहां, constकीवर्ड अधिक सामान्य है क्योंकि यह चर स्थान को दो श्रेणियों में विभाजित करता है, जबकि प्रकार इसे कई में निर्दिष्ट करता है।
पोइयो 13

"सूचक" को एक साथ रहना चाहिए। तो वहाँ के लिए कोई अस्पष्टता हैT const*
Dexter

13

यद्यपि वे एक और समान हैं, सी और सी ++ घोषणाओं को पार्स करने के बारे में राइट-लेफ्ट नियम के साथ निरंतरता बनाए रखने के लिए , यह लिखना बेहतर हैFred const &arg

घोषणाओं, अर्हताओं और घोषणाओं के बारे में अधिक समझ विकसित करने के लिए इसे देखें ।


1
मुझे प्रत्यय पसंद है, क्योंकि यह typedefविस्तार के साथ बेहतर काम करता है । उदाहरण: typedef int* pointer;, const pointer नहीं है const int* , यह int* const। प्रत्यय रूप अजीब नहीं है।
मथिउ एम।

4
IMO const T&ठीक-से-बाएँ भी पढ़ता है; यह एक टी स्थिरांक का संदर्भ है। Tऔर constantप्रत्येक विशेषण या संज्ञा के रूप में काम कर सकता है।
जेम्सडेलिन

7

दोनों काम करते हैं, और यहाँ उस आदमी से स्पष्टीकरण है जिसने इसे लिखा था।
उसे उद्धृत करने के लिए:

क्यों? जब मैंने "कॉन्स्ट" का आविष्कार किया (शुरू में "आसानी से" नाम दिया गया था और इसके अनुरूप "राइटली" था), तो मैंने इसे पहले या बाद में टाइप करने की अनुमति दी क्योंकि मैं अस्पष्टता के बिना ऐसा कर सकता था।




3

संदर्भ उसी तरह से काम नहीं करते हैं जैसे कि संकेत: बिंदुओं के लिए आपके पास 'कॉन्स्ट पॉइंटर्स' ( type * const p) और 'पॉइंटर टू कॉन्स्ट' ( const type * pया type const * p) हो सकते हैं।

लेकिन आपके पास संदर्भ के लिए यह नहीं है: एक संदर्भ हमेशा एक ही वस्तु को संदर्भित करेगा; उस अर्थ में आप इस पर विचार कर सकते हैं कि 'संदर्भ' 'कास्ट रेफरेंस' हैं (ठीक उसी तरह जैसे आपके पास 'कास्ट पॉइंटर्स' हो सकते हैं)।

इसलिए 'टाइप एंड कास्ट रेफरी' जैसा कुछ कानूनी नहीं है। आपके पास केवल 'प्रकार का संदर्भ' ( type &ref) और 'निरंतर प्रकार का संदर्भ' हो सकता है ( const type &refया type const &ref; दोनों बिल्कुल बराबर हैं)।

एक आखिरी चीज: भले ही const typeअंग्रेजी में अधिक सही लगता है, लेखन type const"घोषणाएं" बाएं से दाएं की घोषणाओं की अधिक व्यवस्थित समझ की अनुमति देता है: int const & refपढ़ा जा सकता है 'रेफ एक निरंतर अंतर का संदर्भ है'। या अधिक जटिल उदाहरण: int const * const & refरेफ एक स्थिर पॉइंटर से एक स्थिर इंट का संदर्भ है।

निष्कर्ष: आपके प्रश्न में, दोनों बिल्कुल बराबर हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.