2012-12-25 15 views
5

में अपसंदर्भन LLVM स्रोत कोड मैं कोडसंदर्भित और एक ही अनुदेश

MachineInstr *MI = &*I; 

मैं थोड़े ग में newb हूँ ++ और संदर्भ और संकेत के बीच अंतर मेरे लिए काफी अस्पष्ट है की इस पंक्ति पर ठोकर खाई के माध्यम से सोच, और मुझे लगता है कि इस अंतर के बारे में कुछ करना है, लेकिन यह ऑपरेशन मुझे कोई समझ नहीं आता है। क्या किसी के पास ऐसा करने के लिए कोई स्पष्टीकरण है?

+0

क्या यह '& *' आप सोच रहे हैं? – jalf

+0

@jalf: "एक ही निर्देश में संदर्भ और संदर्भण" शीर्षक के बारे में, मेरा मानना ​​है कि सब कुछ हां इंगित करता है;) – Zeta

+0

@jalf: बिल्कुल :) मुझे –

उत्तर

8

I का प्रकार शायद कुछ प्रकार का इटरेटर या स्मार्ट पॉइंटर है जिसमें उत्पन्न करने के लिए unloaded operator*() है। यदि आप I द्वारा संदर्भित ऑब्जेक्ट में अंतर्निहित पॉइंटर प्राप्त करना चाहते हैं तो आपको *I का उपयोग करके ऑब्जेक्ट का संदर्भ मिलता है और फिर आप &*I का उपयोग करके इस संदर्भ का पता लेते हैं।

+0

'आई' वास्तव में एक पुनरावर्तक है। यह पूरी तरह से समझ में आता है :) –

+0

यदि 'I' * सिर्फ * एक सूचक है, तो यह समझ में नहीं आता है। सबसे अधिक संभावना यह एक स्मार्ट सूचक (एक वर्ग जो एक सूचक की तरह "व्यवहार करता है) है। कच्चे सूचक के लिए, '*' और '&' प्रभावी रूप से एक-दूसरे को रद्द कर देते हैं। लेकिन स्मार्ट पॉइंटर्स के लिए, यह एक * कच्चा * पॉइंटर प्राप्त करने का एक तरीका है-ऑब्जेक्ट – jalf

+0

क्षमा करें, मेरा मतलब था इटरेटर और मैंने पॉइंटर लिखा था। मेरी गलती –

2

सी ++ dereference ऑपरेटर के अधिभार की अनुमति देता है, इसलिए यह ऑब्जेक्ट पर अधिभारित विधि का उपयोग कर रहा है, और फिर यह परिणाम का पता ले रहा है और इसे सूचक में डाल रहा है।

+2

करने का कोई कारण नहीं दिखता है ध्यान दें कि ऑपरेटर का पता (उपसर्ग 'और ') को भी परिभाषित किया जा सकता है, लेकिन सेन कोड ऐसा नहीं करता है, इसलिए कोई इसे आमतौर पर अनदेखा कर सकता है। – delnan

+0

@ डेलनान: आकस्मिक रूप से, उस स्थिति में भी आप अभी भी [अजीब चाल] (http://stackoverflow.com/q/6494591/214671) के साथ पता प्राप्त कर सकते हैं। –

+0

@ डेलनन जो बहुत मजेदार होगा: पी –

2

यह बयान:

MachineInstr *MI = &*I; 

Dereferences * साथ I, और & के साथ अपने परिणाम के पता हो जाता है तो MI जो MachineInstr के लिए सूचक है करने के लिए इसे प्रदान करती है। ऐसा लगता है कि I एक पुनरावर्तक है, इसलिए *I एक कंटेनर में संग्रहीत मान है क्योंकि Iterators * ऑपरेटर को पुनरावृत्ति बिंदु पर आइटम वापस करने के लिए परिभाषित करता है। कंटेनर (उदा। एक सूची) में MachineInstr होना चाहिए। यह std::list<MachineInstr> हो सकता है।