कांस्टेबल शून्य क्या है?


89

std::is_voidराज्यों का वर्णन है कि:

सदस्य को निरंतर मूल्य प्रदान करता है जो कि सत्य के बराबर है, यदि T प्रकार शून्य, कॉन्स्ट शून्य, वाष्पशील शून्य या कॉन्स्ट वाष्पशील शून्य है।

फिर क्या हो सकता है const void, या ए volatile void?

यह उत्तर बताता है कि const voidवापसी प्रकार अमान्य होगा (हालांकि VC ++ 2015 पर संकलन)

const void foo() { }

यदि मानक द्वारा, const voidअमान्य है (VC गलत है) - तो क्या है const void?


15
आपके द्वारा लिंक किया गया उत्तर यह नहीं बताता है कि यह अमान्य होगा, यह बताता है कि यह "अर्थहीन" होगा, जिसे मैं " voidबिना किसी भी लाभ की पेशकश नहीं करता const" होगा।

@hvd, उत्तर कहता है कि संकलक को ऐसी योग्यता के बारे में चेतावनी / त्रुटि करनी चाहिए। इसके द्वारा मैं C ++ मानक मान लेता हूँvoid
अजय

2
जवाब में कहा गया है कि संकलक को ऐसी योग्यता के बारे में चेतावनी देनी चाहिए, इसमें त्रुटि का उल्लेख नहीं है, और एक त्रुटि गलत होगी। यह टिप्पणी केवल कार्यान्वयन की गुणवत्ता के बारे में है, अनुरूपता के बारे में नहीं, लेकिन मैं समझ सकता हूं कि यह टिप्पणी से बिल्कुल स्पष्ट नहीं है।

@ यदि मानक यह निर्दिष्ट नहीं करता है कि जब आप अर्थहीन कोड का उपयोग करते हैं तो एक चेतावनी होनी चाहिए। यह जीसीसी द्वारा आपको एक अतिरिक्त संकेत देने का निर्णय था कि यह कोड कुछ भी नहीं करता है। लेकिन कुलपति किसी भी तरह से गलत नहीं है।
user1942027

3
@ अजय जवाब देता है कि क्लैंग एक चेतावनी देता है, और यह कि, लेखक की राय में, अन्य संकलक चाहिए। यदि मानक ने इसकी अनुमति नहीं दी, तो यह एक चेतावनी नहीं बल्कि एक त्रुटि होगी।
मोलबडनीलो

जवाबों:


94

const voidएक प्रकार है जो आप के लिए एक सूचक बना सकते हैं। यह एक सामान्य शून्य सूचक के समान है, लेकिन रूपांतरण अलग तरीके से काम करते हैं। उदाहरण के लिए, const int*इसे संक्षेप में रूपांतरित नहीं किया जा सकता है void*, लेकिन इसे अंतर्निहित रूप से रूपांतरित किया जा सकता है const void*। इसी तरह, अगर आप एक है const void*आप नहीं कर सकते static_castयह एक करने के लिए int*है, लेकिन आप कर सकते हैं static_castयह एक करने के लिए const int*

const int i = 10;
void* vp = &i;                           // error
const void* cvp = &i;                    // ok
auto ip = static_cast<int*>(cvp);        // error
auto cip = static_cast<const int*>(cvp); // ok

4
हालांकि आपका उत्तर अच्छा है, यह इसका कारण नहीं बताता है const void, लेकिन इसके चारों ओर शून्य और गैर-शून्य सूचक [(गैर-) कॉन्स्टेंस-नेस] के साथ है।
अजय

26
@ अजय: मैं असहमत हूं। ए const void*ही एकमात्र कारण है जिसे आप कभी भी देखेंगे const void। इसे एक टेम्प्लेट तर्क के रूप में पास किया जा सकता है, लेकिन यह तर्क प्रकार केवल *इसके अंत में तत्काल होगा।
बेंजामिन लिंडले

@BenjaminLindley आप भाषा के वकील द्वारा पूछे गए सवालconst void में भी देख सकते हैं
cpplearner

3
@ अजय: किसी समय यह प्रश्न एक दर्शन प्रश्न बन जाता है। "कारण" const voidयह है कि C ++ में सभी प्रकार बनाए जा सकते हैं const। यह उसी तरह "मौजूद" है जो voidमौजूद है। @ बेंजामिन लिंडले का जवाब बताता है कि जब आप इसे देखते हैं और आप इसका उपयोग कैसे करते हैं, तो यह किस तरह से है।
क्रिस बेक

23

के रूप में void, const voidएक शून्य प्रकार है। हालाँकि, यदि const voidकोई रिटर्न प्रकार है, तो constअर्थहीन है (यद्यपि कानूनी!), क्योंकि [expr] / 6 :

यदि किसी प्रचलन में शुरू में " cv T " प्रकार होता है , जहाँ Tcv-unqualified गैर-वर्ग, गैर-सरणी प्रकार होता है, तो अभिव्यक्ति का प्रकार Tकिसी भी आगे के विश्लेषण से पहले समायोजित किया जाता है ।

हालाँकि, यह स्वयं एक मान्य प्रकार है और उदाहरण के लिए, C- मानक लाइब्रेरी फ़ंक्शंस में होता है , जहाँ इसका उपयोग तर्क बिंदुओं की सही-सहीता सुनिश्चित करने के लिए किया जाता है: int const*इसे परिवर्तित नहीं किया जा सकता void*, लेकिन void const*


const voidएक वापसी प्रकार फ़ंक्शन प्रकार को प्रभावित करता है, इसलिए यह पूरी तरह से अर्थहीन नहीं है।
cpplearner

1
@cpplearner इसे छोड़कर हर व्यावहारिक अर्थ में है, क्योंकि न तो फ़ंक्शन के हस्ताक्षर और न ही उस पर कॉल का प्रकार प्रभावित होता है।
कोलम्बो

वैसे यह एक फंक्शन टेम्प्लेट के हस्ताक्षर को बदल सकता है। +1 फिर भी
cpplearner

@cpplearner मेला पर्याप्त - यह अभी भी कीस्ट्रोक्स की बर्बादी है, हालांकि।
कोलंबो

हम आम तौर पर देखते हैं: कॉन्स्ट इंट * शून्य पर नहीं जा सकता *, लेकिन कॉन्स्टेबल शून्य *।
mgouin

18

प्रकार टेम्पलेट का परिणाम हो सकते हैं; एक टेम्पलेट राज्य हो सकता है const T, और के Tरूप में साथ त्वरित किया जा सकता है void

लिंक किए गए उत्तर को गुमराह किया जाता है, या यों कहें कि यह एक गैर-टेम्पलेट प्रकार के विशेष मामले के संबंध में सीमित है, और तब भी अर्थहीनconst void हो सकता है , लेकिन यह मान्य कोड है

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