2012-11-22 11 views
5

निम्नलिखित कोड पर विचार करें:std :: context_wrapper टी एंड में परिवर्तित कब होता है?

#include <iostream> 
#include <functional> 

using namespace std; 

template<class T> 
void fun(T t) 
{ 
    t+=8; 
} 


int main() 
{ 
    int i = 0; 
    fun(ref(i)); 
    cout << i << endl; 
} 

इस कोड को प्रिंट "8"। मुझे लगता है कि मजेदार (टी) में टी स्वचालित रूप से int & में परिवर्तित हो जाता है।

लेकिन अगर मैं t+=8t=8 के साथ प्रतिस्थापित करता हूं, तो प्रोग्राम संकलित नहीं होगा।

क्यों?

उत्तर

3

reference_wrapper<T>T & को एक अंतर्निहित रूपांतरण ऑपरेटर है, इसलिए यह T & में परिवर्तित हो जाएगा जहाँ भी एक T & एक reference_wrapper<T> तुलना में एक बेहतर मुकाबला नहीं है।

संवर्धित असाइनमेंट अभिव्यक्ति में, केवल व्यवहार्य ऑपरेटर int &operator+=(int &, int) है इसलिए int & निकाला गया है।

असाइनमेंट अभिव्यक्ति में, सदस्य ऑपरेटर reference_wrapper<int>::operator=(const reference_wrapper<int> &) भी उपलब्ध है, इसलिए सदस्य ऑपरेटर को प्राथमिकता दी जाती है; संकलक तब निरंतर 8 से संदर्भ रैपर बनाने का प्रयास करता है, जो विफल रहता है। असाइनमेंट ऑपरेटर के पास रिबंडिंग का प्रभाव होता है, जो tie जैसी सुविधाओं के लिए आवश्यक है, जो अपेक्षा के अनुसार काम करता है।

इसका मतलब है कि संदर्भ रैपर सी ++ संदर्भ से अजगर जैसी भाषाओं में संदर्भ के करीब हैं:

#include <functional> 
#include <iostream> 

int main() { 
    int i = 1, j = 2; 
    std::ref(i) = j; 
    std::cout << i << '\n';     // prints '1' 
} 
+0

धन्यवाद, ecatmur, समझ में आता है कि। – oz1cz

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