अच्छी तरह से ref
एक वस्तु का reference_wrapper
संदर्भ रखने के लिए उपयुक्त प्रकार की एक वस्तु का निर्माण करता है । जिसका अर्थ है जब आप आवेदन करें:
auto r = ref(x);
यह (यानी ) के reference_wrapper
लिए एक सीधा संदर्भ देता है और नहीं । यह (यानी ) इसके बजाय रखती है ।x
T&
reference_wrapper
r
T&
एक reference_wrapper
बहुत उपयोगी है जब आप एक अनुकरण करने के लिए चाहते हैं reference
एक वस्तु जो कॉपी किया जा सकता की (यह दोनों है कॉपी-constructible और कॉपी-आबंटित )।
C ++ में, एक बार आप एक संदर्भ (जैसे बनाने के y
लिए एक वस्तु (कहने के लिए) x
), तो y
और x
एक ही साझा आधार पते । इसके अलावा, y
किसी अन्य वस्तु को संदर्भित नहीं कर सकता। इसके अलावा आप संदर्भों की एक सरणी नहीं बना सकते हैं अर्थात कोड इस तरह से एक त्रुटि फेंक देगा:
#include <iostream>
using namespace std;
int main()
{
int x=5, y=7, z=8;
int& arr[] {x,y,z};
return 0;
}
हालांकि यह कानूनी है:
#include <iostream>
#include <functional> // for reference_wrapper
using namespace std;
int main()
{
int x=5, y=7, z=8;
reference_wrapper<int> arr[] {x,y,z};
for (auto a: arr)
cout << a << " ";
return 0;
}
आपकी समस्या के बारे में बात कर रहे हैं cout << is_same<T&,decltype(r)>::value;
, समाधान है:
cout << is_same<T&,decltype(r.get())>::value;
मैं आपको एक कार्यक्रम दिखाता हूं:
#include <iostream>
#include <type_traits>
#include <functional>
using namespace std;
int main()
{
cout << boolalpha;
int x=5, y=7;
reference_wrapper<int> r=x;
cout << is_same<int&, decltype(r.get())>::value << "\n";
cout << (&x==&r.get()) << "\n";
r=y;
cout << (&y==&r.get()) << "\n";
r.get()=70;
cout << y;
return 0;
}
यहाँ देखें हम तीन बातें जानते हैं:
एक reference_wrapper
ऑब्जेक्ट (यहां r
) का उपयोग उन संदर्भों की एक सरणी बनाने के लिए किया जा सकता है, जिनके साथ संभव नहीं था T&
।
r
वास्तव में एक वास्तविक संदर्भ की तरह काम करता है (देखें कि r.get()=70
मूल्य कैसे बदला y
)।
r
के रूप में ही नहीं है, T&
लेकिन r.get()
है। इसका मतलब है कि r
रखती है T&
जैसा कि इसके नाम से पता चलता है यानी एक है एक संदर्भ के आसपास आवरण T&
।
मुझे आशा है कि यह उत्तर आपकी शंकाओं को समझाने के लिए पर्याप्त से अधिक है।