2012-04-11 10 views
11

उपयोग मामला:कक्षा के स्थिर सदस्य कार्यों के लिए "कॉन्स्ट-शुद्धता" की कोई अवधारणा क्यों नहीं है?

class A { 
    static int s_common; 
public: 
    static int getCommon() const { s_common; }; 
}; 

आमतौर पर यह के रूप में एक त्रुटि में परिणाम है:

error: static member function ‘static int A::getCommon()’ cannot have cv-qualifier

इसका कारण यह है const सत्ता केवल वस्तु this से बताया है, जो एक static सदस्य समारोह में मौजूद नहीं है पर लागू होता है ।

हालांकि इसे अनुमति दी गई थी, static सदस्य फ़ंक्शन की "कॉन्स" नेस static डेटा सदस्यों से आसानी से संबंधित हो सकती थी।
यह सुविधा सी ++ में क्यों नहीं है; इसके पीछे कोई तार्किक कारण?

+1

@keety, [वह प्रश्न] (http://stackoverflow.com/questions/7035356/c-why-static-member-function-cant-be-created-with-const-qualifier) ​​संबंधित है और डुप्लिकेट नहीं है , मैंने इसे देखा और इसे ऊपर उठाया। 'इस' सूचक तर्क मैंने अपने प्रश्न में भी उल्लेख किया है और यह पर्याप्त प्रतीत नहीं होता है। – iammilind

+0

ठंडा लेकिन शायद बेहतर अगर आप प्रश्न में मूल धागे को संदर्भ प्राप्त करने के लिए लिंक करते हैं या आप एक ही उत्तर – keety

उत्तर

6

cv-qualifiers फ़ंक्शन के हस्ताक्षर को प्रभावित करता है। तो तुम हो सकता है:

class A { 
    static int s_common; 
public: 
    static void getCommon() const { }; 
    static void getCommon() { }; 
}; 

अब ... कैसे आप const एक कहेंगे? इसे कॉल करने के लिए const ऑब्जेक्ट नहीं है (ठीक है, आप इसे const ऑब्जेक्ट पर कॉल कर सकते हैं, लेकिन यह बात नहीं है)।

मैं बस अनुमान लगा रहा हूं, शायद अन्य कारण भी हैं। :)

+3

इस तरह के संयोजन को केवल अवैध माना जा सकता है। मुझे यकीन नहीं है कि संभावना से निपटने के लिए यह एक अच्छा पर्याप्त कारण है। –

+2

@ माइकल एंडरसन क्यों अवैध होगा? मानक कहता है कि आप सीवी-क्वालिफायर द्वारा अधिभारित कर सकते हैं। यदि हम पर्याप्त नियमों को बदलते हैं तो कुछ भी अवैध माना जा सकता है। –

+0

-1 @ लुचियान: नए नियम जो 'स्थिर कॉन्स 'को अनुमति देंगे, उन्हें ओवरलोडिंग अमान्य बनाना होगा, क्योंकि इसे आसानी से कास्टिंग के अलावा हल नहीं किया जा सकता है। यही कारण है कि। इसलिए मुझे लगता है कि आपका उत्तर गलत तरीके से समाधान के रूप में चुना गया था: यह एक कारण नहीं है, केवल एक सहयोगी गलतफहमी है। –

1

मेरा अनुमान है कि सदस्य सदस्य चर पर static और const का उपयोग करके स्थिर सदस्य चर की स्थिरता को संदर्भित करने के लिए कभी भी एक विकल्प के रूप में नहीं माना जाता था। आईएमओ आपका सुझाव उन दो कीवर्ड को मिश्रित करने का एक अजीब (लेकिन शायद समझदार) तरीका है।

5

सदस्य कार्यों पर const सीवी-क्वालीफायर होने के लिए तर्क है:
इंगित करने के लिए छिपा सूचक this सदस्य कार्य करने के लिए पारित किया जा रहा अपरिवर्तनीय है और यह बदला नहीं जा सकता। static सदस्य फ़ंक्शन में छिपा this पैरामीटर नहीं है, और इसलिए सदस्य कार्यों के लिए const व्यर्थ है।

हालांकि इसकी अनुमति दी गई थी, स्थिर सदस्य फ़ंक्शन की "कॉन्स" नेस स्थिर डेटा सदस्यों से आसानी से संबंधित हो सकती थी।

यह const क्वालीफायर के साथ शुरू करने के लिए तर्क नहीं था, यह इस तथ्य से स्पष्ट है कि आपके पास एक मुक्त फ़ंक्शन पर लागू सीवी-क्वालीफायर नहीं हो सकते हैं। cv-qualifiers केवल this के लिए थे, जिस वस्तु का कार्य कहलाता है।

+0

के साथ समाप्त हो जाते हैं तो मैंने अपनी टिप्पणी भी हटा दी है क्योंकि इसकी आपकी पिछली टिप्पणी के बिना इसका कोई अर्थ नहीं है। मुझे लगता है कि एक अनंत लूप आ रहा है। :)) –

+0

दिलचस्प, मैं बस 'कॉन्स्ट' के बारे में सोच रहा था क्योंकि समारोह बताते हुए ऑब्जेक्ट नहीं बदलेगा। इसका मतलब यह है कि यह स्थैतिक फ़ंक्शन के लिए अनिवार्य है (क्योंकि इसमें * कोई ऑब्जेक्ट नहीं है) लेकिन मैं नहीं देख सकता कि इसे अनदेखा करने के बजाय * अस्वीकृत क्यों किया जाएगा *। – paxdiablo

1

अच्छा सवाल।

मेरा मानना ​​है कि अवधारणात्मक रूप से कॉन्स्ट-नेस अच्छी तरह से परिभाषित वस्तु या डेटा संरचना पर लागू होता है। वैश्विक/स्थैतिक या आदि के लिए नहीं

वैसे ही मैं पूछ सकता हूं कि वैश्विक (या वैकल्पिक रूप से नामस्थान-विशिष्ट) फ़ंक्शन const क्यों नहीं हो सकता है, यानी यह किसी भी वैश्विक (या नेमस्पेस-विशिष्ट) चर को संशोधित नहीं करने का वादा कर सकता है ।

यह आईएमएचओ को बहुत अधिक समझ में नहीं आता है। लेकिन हां, एक विशिष्ट वर्ग से संबंधित स्थिर सदस्यों की स्थिरता - यह कुछ मामलों में उपयोगी हो सकता है IMHO।

8

However had it been allowed, the static member function's "const"ness could have been easily related to the static data members.

यह वह जगह है जहां आपका प्रश्न भ्रमित हो जाता है। const के रूप में घोषित एक गैर स्थैतिक सदस्य फ़ंक्शन में अभी भी स्थिर डेटा सदस्यों तक पहुंच गैर-const है। const केवल this पर लागू होता है (यानी: गैर स्थैतिक डेटा सदस्य)।

यह एक स्थिर सदस्य फ़ंक्शन के लिए const का उपयोग वाक्य रचनात्मक रूप से करने के लिए कोई समझ नहीं लेगा, फिर भी एक पूरी तरह से अलग परिणाम है (यानी: स्थिर डेटा सदस्यों const तक पहुंच बनाना)।

इसके अलावा, स्थिर डेटा सदस्य वर्ग-स्कोप्ड वैश्विक चर से अधिक कुछ नहीं हैं जिनके पास कक्षा पहुंच नियंत्रण (सार्वजनिक/निजी/आदि) है। इसलिए कुछ कार्यों के लिए अलग-अलग const उनके पास पहुंच नहीं है, खासकर उनके हस्ताक्षर के आधार पर।

2

एक ऐसा फ़ंक्शन जो को परिवर्तित नहीं करता वैश्विक स्थिति शुद्ध है। सी ++ 11 विशेषताओं पर परिचय देता है जिसमें विशेष प्लेटफार्मों पर [[pure]] शामिल हो सकता है।

const के साथ एक समस्या यह है कि यह प्रकार फ़ंक्शन के भाग का हिस्सा है। असाइन करना कि static const फ़ंक्शन को "सामान्य" फ़ंक्शन पॉइंटर पर एक विशेष रूपांतरण, कास्ट, या क्षय नियम की आवश्यकता होगी। और जैसा कि लुचियन का उल्लेख है, यह पूरी तरह से अस्पष्ट अधिभार की अनुमति देगा।

अनिवार्य रूप से आप static सदस्यों से एक सिंगलटन ऑब्जेक्ट बनाने का वर्णन कर रहे हैं, जो एक सामान्य, योग्य अप्रत्यक्ष पहुंच पथ साझा करते हैं। गैर-कॉन्स्ट ऑब्जेक्ट को कॉन्स दिखाई देने के लिए, इसे किसी चीज़ के माध्यम से एक्सेस किया जाना चाहिए, लेकिन this नहीं है। क्या यह decltype बदल जाएगा? कोई अच्छा जवाब नहीं है। यदि आप यह सब चाहते हैं, तो उन्हें class ऑब्जेक्ट के अंदर स्पष्ट रूप से रखें।

+0

यह एक अच्छा मुद्दा है। [[शुद्ध]] एक विस्तार है? मैं आम तौर पर [सी ++ 11 के लिए विकी लिंक] (http: //en.wikipedia।संगठन/विकी/सी% 2 बी% 2 बी 11), लेकिन सरल grep द्वारा यह नहीं मिला। – iammilind

+0

@iammilind '[[शुद्ध]]' मानक नहीं है, और मुझे नहीं लगता कि कोई प्लेटफॉर्म इसे लागू करता है। लेकिन जीसीसी में __attribute __ ((शुद्ध)) है और एमएसवीसी के पास कुछ समान है, आईआईआरसी। गुण विवादास्पद हैं और प्रमुख कार्यान्वयन के बीच बहिष्कार हो सकता है (हर्ब सटर के हालिया लेख देखें) ताकि '[[शुद्ध]] जैसी चीजें पोर्टेबल न हों। – Potatoswatter

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

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