2013-02-27 151 views
9
  • सूची end() पिछले-एंड-एंड इटरेटर की प्रतिलिपि देता है, है ना?
  • इसलिए, list.end() एक रैवल्यू है, है ना?
  • - ऑपरेटर-फ़ंक्शन सूची पुनरावर्तक के लिए अतिभारित एक गैर-कॉन्स्ट संदर्भ लेता है, है ना?
  • आप गैर-कॉन्स संदर्भों के लिए राइंड्स को बाध्य नहीं कर सकते हैं, है ना?

तो कैसे आक्यों --list.end() संकलित करता है?

std::list<int> lst; 
// ... 
--l.end();` 

संकलित करता है?

जैसा कि सही ढंग से इंगित किया गया है, मेरा तीसरा बिंदु जरूरी नहीं है। लेकिन फिर इस कोड के बारे में कैसे संकलित करता है?

struct A{}; 

void f(A&) 
{ 

} 
A a() 
{ 
    return A(); 
} 

int main() 
{ 
    f(a()); 
} 
+2

तीसरा बिंदु गलत है। – Nawaz

+0

@banuj: मुझे –

+0

समझ में नहीं आ रहा है मैं असहमत हूं कि आपका दूसरा उदाहरण संकलित करता है: http://ideone.com/V98wW3 –

उत्तर

12
  • - ऑपरेटर-समारोह सूची इटरेटर के लिए अतिभारित एक गैर स्थिरांक संदर्भ, सही लगता है?

यह बिंदु गलत है। operator-- एक सदस्य फ़ंक्शन है, और एक सदस्य फ़ंक्शन अस्थायी पर लागू किया जा सकता है। आप किसी सदस्य को इस सदस्य फ़ंक्शन को तर्क के रूप में पास नहीं करते हैं। तो गैर-कॉन्स्ट संदर्भ के लिए बाध्यकारी रावल्यू का सवाल पहले स्थान पर नहीं उठता है।


संपादन के लिए के रूप में (गुजर rvalue f(A&){} करने के लिए), यह एक गैर मानक विस्तार है। I अनुमान आप माइक्रोसॉफ्ट कंपाइलर का उपयोग कर रहे हैं, क्योंकि मुझे पता है कि इसमें यह गैर-मानक एक्सटेंशन है जो मेरी राय में बेवकूफ है।

+0

ओह ... ठीक है :) मैं मूर्ख हूँ। तर्क का पुनर्गठन ध्वनि है, है ना? :) –

+0

बीटीडब्ल्यू, क्या मानक जनादेश है - सदस्य बनें? या यह कार्यान्वयन परिभाषित है? –

+0

असल में यह एक सदस्य समारोह नहीं है। इटेटरेटर एक सूचक हो सकता है। –