2010-09-09 6 views
7

मैं सोच रहा था, क्यों कोड (पहले से ही बाहर टिप्पणी की) की निम्नलिखित तरीके
C2102: '&' requires l-valueक्यों इस C2102 खड़ी कर रहा है: 'और' की आवश्यकता है l-मूल्य

कारण होगा वहाँ एक बेहतर तरीका tmp चर का उपयोग कर से बचने के लिए है ?

class a { 
private: 
    int *dummy; 
public: 
    int* get_dummy() const { 
     return dummy; 
    } 
}; 

int main() 
{ 
    a aa; 

    // error C2102: '&' requires l-value 
    //int** me = &(aa.get_dummy()); 

    // OK! 
    int *tmp = aa.get_dummy(); 
    int** me = &(tmp); 
} 
+0

सूचक के लिए एक संदर्भ वापस करें। –

+0

["एल-वैल्यू आवश्यक" त्रुटि का संभावित डुप्लिकेट] (http://stackoverflow.com/questions/1353384/l-value-required-error) – sigy

उत्तर

4

क्योंकि a::get_dummy()नामित अस्थायी ऑब्जेक्ट (int सूचक) देता है।
फ़ंक्शन स्टैक फ्रेम पर ऑब्जेक्ट पर लौटा ऑब्जेक्ट और इसका पता प्राप्त करना व्यर्थ है क्योंकि यह अभिव्यक्ति समाप्त होने के बाद अमान्य हो सकता है।

+0

लुका के उत्तर के समान ही मुद्दा था। 'tmp' एक स्टैक ऑब्जेक्ट है! –

+0

'डमी 'एक अस्थायी वस्तु या स्थानीय वस्तु नहीं है। – Naveen

+0

@ नवीन: हाँ, यह सच है। लेकिन जवाब "अज्ञात अस्थायी" (जो इसकी पूर्ण अभिव्यक्ति के अंत तक रहता है) नहीं कहता है, यह "स्टैक ऑब्जेक्ट" कहता है जिसका आमतौर पर "स्वचालित" संग्रहण में एक ऑब्जेक्ट होता है जो इसके दायरे के अंत तक रहता है। –

4

सं

क्या पता me अन्यथा शामिल हैं? यहां आपने इसे tmp का पता दिया - लेकिन यदि आप इसे int** me = &aa.get_dummy(); से प्रतिस्थापित करते हैं, तो यह कहां इंगित करेगा?

उस प्रश्न का कोई सार्थक उत्तर नहीं है, इसलिए मानक की आवश्यकता है कि & का तर्क एक अंतराल हो।

+0

'यह कहां इंगित करेगा?' - क्या यह इंगित नहीं करता है डमी इंस्टेंस का पता? –

+0

@ यान: नहीं। फ़ंक्शन 'डमी' द्वारा संग्रहीत पता (या मान) देता है, न कि 'डमी'। –

+1

@ यान: आप संदर्भ से डमी वापस कर सकते हैं, उदा। int * और get_dummy। समस्या के उचित समाधान का सुझाव देने के लिए – Puppy

7

इसके बजाय आप निर्धारित कर सकते हैं:

int **get_dummy() ... return &dummy; 

आप अनिवार्य रूप से, अभिव्यक्ति के रूप में एक आर मूल्य के बारे में सोच सकते हैं, जबकि एक एल-मूल्य एक वास्तविक वस्तु है। अभिव्यक्तियों में पते नहीं हैं, और यदि उन्होंने किया है, तो यह कल्पना करना मुश्किल है कि पता क्या होगा। यह समझना आसान है कि किसी ऑब्जेक्ट का पता उपयोगी कैसे हो सकता है।

इस तरह की एक समस्या को समझना थोड़ा मुश्किल है। पॉइंटर्स और संकलित भाषाओं की समझ विकसित करने का सबसे अच्छा तरीका असेंबली भाषा सीखना है।

+1

+1। –

+0

मुझे get_dummy स्रोत कोड तक पहुंच नहीं है। –

+0

हम्म, आप '& aa' का उपयोग करने में सक्षम हो सकते हैं, लेकिन अन्यथा, आप अप्रत्यक्ष सूचक क्यों चाहते हैं? क्या पॉइंटर बदलने के लिए कोई एपीआई नहीं है? क्या आप इसे भी बदलना चाहते हैं? स्थानीय चर के पते को लेना खतरनाक है ... – DigitalRoss

0

& ऑपरेटर को एक लाभार्थी पर लागू किया जाना चाहिए। जब कॉल aa.get_dummy() किसी चर के लिए असाइन नहीं किया गया है, तो इसका वापसी मान केवल स्टैक पर रखा जाता है, इसलिए यह एक स्टैक आइटम का पता प्राप्त करने के लिए मूर्ख (और गलत) होगा।

+2

एर .. 'tmp' एक स्टैक आइटम है। –

+0

मेरा मतलब अज्ञात स्टैक आइटम –

0

संकलक सही है, आईएसओ सी ++ § 5.3.1.3 के अनुसार:

एकल & ऑपरेटर का परिणाम अपने संकार्य के लिए सूचक है। ऑपरेंड एक लेल्यू या योग्य-आईडी होगा।

दूसरे शब्दों में, आप कुछ भी एक नाम है कि के एक पते ले सकते हैं।

मान कार्यों से लौटे दर-मूल्य कोई नाम नहीं है और अक्सर एक रजिस्टर के माध्यम से चुना जाता है। तो स्मृति में रहने वाले मूल्य के बारे में बात करने के लिए "पता" कोई बात नहीं है!

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

मनोरंजक रूप से, संकलक is that smart जब यह संदर्भ पर एक रावल्यू के लिए आता है। लेकिन पॉइंटर के लिए एक रैल्यू के लिए ऐसी कोई कार्यक्षमता नहीं है।

अपने प्रश्न का उत्तर देने के लिए: सामानों के पते को कम करने का प्रयास करें; एक चर का पता लेना अनुकूलक को इसे एक रजिस्टर में रखने से रोकता है। लेकिन तुम, बजाय एक संदर्भ वापस जाने के लिए है, तो:

class a { 
private: 
    int dummy; 
public: 
    int get_dummy() const { 
     return dummy; 
    } 
    int& get_dummy() { 
     return dummy; 
    } 
}; 

int main() 
{ 
    a aa; 

    int* me = &(aa.get_dummy()); 
} 

ध्यान दें कि एक const get_dummy() होने सख्ती की जरूरत नहीं है, लेकिन rvalue संदर्भों में अनुकूलक में मदद मिलेगी।

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