2009-10-22 21 views
21

कहें कि मेरे पास यह उदाहरण है:वापसी प्रकार पर एक प्रकार का क्वालीफायर क्यों अर्थहीन है?

char const * const 
foo(){ 
    /* which is initialized to const char * const */ 
    return str; 
} 

संकलक चेतावनी से बचने के लिए इसे करने का सही तरीका क्या है "रिटर्न प्रकार पर क्वालीफायर टाइप अर्थहीन है"?

+5

क्या यह सिर्फ मुझे है या इस प्रश्न में स्पष्टता नहीं है? – jldupont

+2

@ जीन-लो: मैं मानता हूं कि प्रश्न का शरीर कुछ हद तक अस्पष्ट है, लेकिन सवाल का शीर्षक अकसर इसका अर्थ बताता है। – sbi

उत्तर

22

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

int f(); 
    int main() { f() = 0; } // error anyway! 

    // const redundant. returned expression still has type "int", even though the 
    // function-type of g remains "int const()" (potential confusion!) 
    int const g(); 

सूचना है कि "जी" के प्रकार के लिए, स्थिरांक महत्वपूर्ण है, लेकिन प्रकार int const से उत्पन्न rvalue भाव के लिए स्थिरांक नजरअंदाज कर दिया है।

int const f(); 
    int f() { } // different return type but same parameters 

कोई रास्ता मेरे लिए जाना जाता है आप "जी" खुद (के प्रकार पर हो रही है और एक टेम्पलेट के लिए &f गुजर से "स्थिरांक" दूसरे का निरीक्षण करने और अपने प्रकार अनुमान कर सकता है: तो अनुसरण करने में त्रुटि है , उदाहरण के लिए)। अंत में ध्यान दें कि "char const" और "const char" एक ही प्रकार का संकेत देते हैं। मैं आपको एक विचार के साथ व्यवस्थित करने और पूरे कोड में इसका उपयोग करने की सलाह देता हूं।

+7

मैं हमेशा "const" (char const * const) का पीछा करते हुए अनुशंसा करता हूं, क्योंकि यह एकमात्र तरीका है जिसे आप लगातार "const" * का उपयोग कर सकते हैं। हालांकि, मैं इस पर बुरी तरह से गिनती हूं ... – DevSolar

+0

@ डेवसोलर: अधिकांश गुरु (उदाहरण के लिए सटर) आपके साथ सहमत हैं और प्रकार (कक्षा कांस्टेस, वर्ग अस्थिर) के बाद क्वालीफायर रखें। –

+1

@ डेवसोलर, बस स्पष्ट करने के लिए: वे अंतिम पिछली स्थिरता के बारे में आपसे सहमत नहीं हैं। वे आपके पहले कॉन्स से सहमत हो सकते हैं जो टाइप नाम के बाद दिखाई देता है। –

4

सी में, क्योंकि फ़ंक्शन वापसी मूल्य, और योग्यता मान व्यर्थ है।
यह सी ++ में भिन्न हो सकता है, अन्य उत्तरों की जांच करें।

const int i = (const int)42; /* meaningless, the 42 is never gonna change */ 
int const foo(void); /* meaningless, the value returned from foo is never gonna change */ 

केवल वस्तुओं सार्थक योग्य हो सकता है। पिछले जवाब की

const int *ip = (const int *)&errno; /* ok, `ip` points to an object qualified with `const` */ 
const char *foo(void); /* ok, `foo()` returns a pointer to a qualified object */ 
+0

ध्यान दें कि कक्षा के प्रकारों के लिए, वापसी मूल्यों के लिए 'const' अर्थहीन नहीं है, क्योंकि आपको गैर-कॉन्स्टेंस राल्यूज़ पर सदस्य कार्यों को संशोधित करने की अनुमति है। (हमने इसे यहाँ दूसरे दिन तारों के साथ किया था: '(एस 1 + एस 2) .append (एस 3) '।) सामान्य रूप से, litb का जवाब यह सब विस्तार और शुद्धता दोनों में बताता है। – sbi

+0

मेरा मतलब केवल सी से निपटने का मेरा जवाब था। इसे प्रतिबिंबित करने के लिए अद्यतन किया गया। – pmg

+0

आह, उसने एक "सी/सी ++" प्रश्न पूछा है। (अजीब भाषा, वह।) क्षमा करें, मैंने इसे भी नहीं देखा था। – sbi

1

कोई भी वास्तव में सवाल का हिस्सा "यह करने के लिए सही तरीके से" जवाब।

मुझे विश्वास है कि यह करने के लिए जवाब है:

char const * foo(){ 

जो कहते हैं आप एक सूचक एक निरंतर चरित्र लौट रहे हैं।

+0

मैं इसे एक चरित्र के लिए एक स्थिर सूचक होने के लिए समझता हूं, एक स्थिर चार – atlex2

+0

नहीं, वास्तव में @ user1076543 सही है, यह स्थिर चर के लिए एक सूचक है क्योंकि 'char const * 'और' const char * * हैं। वही। एक चरित्र के लिए एक स्थिर सूचक 'char * const' होगा। –

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