2017-03-31 9 views
6

मैं एक बाहरी सी फ़ंक्शन का उपयोग करता हूं जो गतिशील रूप से आवंटित const char* देता है।क्यों कॉन्स्ट शून्य * के लिए कोई std :: मुफ्त अधिभार नहीं है?

मैं इसे प्रबंधित करने के लिए unique_ptr<const char, decltype(std::free)> का उपयोग करना चाहता हूं।

लेकिन std::free(const void*) अधिभार नहीं है इसलिए मुझे invalid conversion from 'const void*' to 'void*' मिलते हैं और const_cast<char*>() का उपयोग करना होगा।

क्या यह सिर्फ एक मानक पुस्तकालय अपूर्णता है या इसके पीछे कुछ और है?

+3

@ फोर्सब्रू, सूचक 'const' नहीं है, यह 'const' स्मृति को इंगित करता है। – sad1raf

+2

@ForceBru: फिर भी यह ठीक है ['हटाएं '' const' पॉइंटर्स] (http://stackoverflow.com/q/755196/10077)। –

+0

@FredLarson, यह नहीं पता था, जानकारी के लिए धन्यवाद! – ForceBru

उत्तर

2

std::free सी मानक पुस्तकालय से विरासत में मिला है। सी में ओवरलोडिंग नहीं है, इसलिए const अधिभार विरासत में नहीं मिला हो सकता था।

जबकि सी ++ मानक पुस्तकालय ने कुछ उपयोगी ओवरलोड के साथ विरासत सी लाइब्रेरी को बढ़ाया है, const ओवरलोड को free के लिए जोड़ा नहीं गया है।

या तो ऐसे अधिभार को कभी नहीं माना गया है, या इसे मानक के अतिरिक्त इसके अतिरिक्त वारंट के लिए पर्याप्त नहीं माना गया है। मैं इस तरह के एक जोड़े के लिए किसी भी खुले तौर पर उपलब्ध प्रस्ताव में नहीं आया हूं - हालांकि मैंने कभी भी सभी प्रस्तावों को नहीं पढ़ा है, न ही मैंने किसी भी समिति की बैठकों या कार्यशालाओं में भाग लिया है, इसलिए मैं इस तरह के अस्तित्व की संभावना से इंकार नहीं कर सकता दस्तावेज़।

ऐसे अधिभार की कमी के आसपास काम करने के लिए, आप वास्तव में const_cast का उपयोग कर सकते हैं। इस संदर्भ में, यह पूरी तरह से सुरक्षित है।

+1

यह एक अधिभार की आवश्यकता नहीं होगी। 'कॉन्स्ट शून्य *' वाला एक भी कार्य सी और सी ++ दोनों में काम करेगा। – hvd

+0

@ एचवीडी निश्चित। लेकिन सी ++ मानक सी पुस्तकालय कार्यों के किसी भी समारोह हस्ताक्षर बदल गया है? क्या समिति भी इस तरह के विकल्प पर विचार करेगी? मैं ऐसा नहीं मानूंगा, लेकिन शायद। शायद सी लाइब्रेरी बदली जाएगी, लेकिन मुझे लगता है कि इनके लिए निहित कॉन्स टी * -> टी * रूपांतरण सी – user2079303

+0

में कानूनी है, हां, सी ++ मानक ने सी लाइब्रेरी फ़ंक्शंस के फ़ंक्शन हस्ताक्षर बदल दिए हैं (देखें 'strchr'), लेकिन नहीं, मेरा मतलब यह नहीं था। * यदि * सी समिति को यह घोषित करना था कि 'मुक्त (कॉन्स शून्य *)' समझ में आता है और उसके अनुसार हस्ताक्षर समायोजित करता है, तो सी ++ इसे अपना सकता है। और नहीं, मानक सी में कोई अंतर्निहित 'कॉन्स टी *' -> 'टी *' रूपांतरण नहीं है, और कभी नहीं है। सी कंपाइलर इसे विस्तार के रूप में समर्थन देने के लिए स्वतंत्र हैं। सी ++ कंपाइलर्स को इसे विस्तार के रूप में समर्थन देने की भी अनुमति है, यह सिर्फ इतना है कि इसे C++ में सही तरीके से करना मुश्किल हो क्योंकि यह SFINAE उपयोगों को तोड़ सकता है, यही कारण है कि सी ++ कंपाइलर आमतौर पर – hvd

संबंधित मुद्दे