2013-05-14 7 views
17

मैं समझने की कोशिश कर रहा हूं कि std :: ref कैसे काम करता है।संदर्भ_वापर और std :: ref कैसे काम करते हैं?

#include <functional> 
#include <iostream> 

template <class C> 
void func(C c){ 
    c += 1; 
} 

int main(){ 
    int x{3}; 
    std::cout << x << std::endl; 
    func(x); 
    std::cout << x << std::endl; 
    func(std::ref(x)); 
    std::cout << x << std::endl; 
} 

Output : 3 3 4 

उपरोक्त कोड में, मैं तीसरे समारोह कॉल के लिए टेम्पलेट पैरामीटर Cstd::reference_wrapper<int> के रूप में instantiated है लगता है। the reference, पढ़ने के दौरान मैंने देखा कि std::reference_wrapper<int> में कोई += ऑपरेटर नहीं है। फिर, c += 1; मान्य है?

उत्तर

18

c += 1; मान्य है?

क्योंकि reference_wrapper<int> परोक्ष इसके रूपांतरण ऑपरेटर के माध्यम से int& के लिए परिवर्तनीय है, और ऑपरेंड के लिए निहित रूपांतरणों को माना जाता है यदि ऑपरेंड प्रकार के लिए कोई उपयुक्त अधिभार नहीं है।

+0

फिर, सी अभी भी संदर्भ_वापर है, है ना? – Sungmin

+0

@ सुंगमिन: दरअसल, 'सी' स्वयं प्रकार बदल नहीं सकता है; लेकिन 'c.operator int &()' के परिणामस्वरूप '+ =' लागू किया गया है जो 'संदर्भ_वापर' के लक्ष्य का संदर्भ होगा। –

+0

धन्यवाद, मैं समझता हूं। – Sungmin

12

std::reference_wrapper<T> में conversion operator से T& है। इसका मतलब है कि std :: context_wrapper को आपके उदाहरण में int& में स्पष्ट रूप से परिवर्तित किया जा सकता है।

+0

दो उत्तरों को लगभग एक ही समय में अपलोड किया गया था। लेकिन माइक सेमुर का जवाब थोड़ा तेज़ है। इसके अलावा, मैं यह निर्धारित नहीं कर सकता कि कौन सी चुनना है। उसके लिए खेद है। फिर भी धन्यवाद। – Sungmin

+1

@ सुंगमिन आपका स्वागत है। मुझे लगता है कि सेमुर का जवाब वैसे भी बेहतर है: वह ऑपरेटर ओवरलोड और ऑपरेंड के बारे में बताता है, जो मैं करने में असफल रहा। – juanchopanza

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