ভাল ref
কোনও বস্তুর reference_wrapper
রেফারেন্স ধরে রাখতে উপযুক্ত টাইপের একটি অবজেক্ট তৈরি করে r আপনি যখন আবেদন করেন যার অর্থ:
auto r = ref(x);
এটি (যেমন ) এর reference_wrapper
সরাসরি উল্লেখ হিসাবে নয় এবং প্রদান করে returns এটি (অর্থাত্ ) পরিবর্তে ধরে রাখে ।x
T&
reference_wrapper
r
T&
একটি reference_wrapper
খুবই দরকারী যখন আপনি একটি অনুকরণ করতে চান reference
একটি বস্তু যা কপি করা যেতে পারে (এটি উভয় কপি-অঙ্কনযোগ্য এবং কপি-হস্তান্তরযোগ্য )।
সি ++ এ, আপনি একবার 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&
।
আমি আশা করি এই উত্তরটি আপনার সন্দেহগুলি ব্যাখ্যা করার জন্য যথেষ্ট বেশি।