ดีref
สร้างวัตถุของการที่เหมาะสมที่reference_wrapper
ประเภทที่จะถือการอ้างอิงไปยังวัตถุ ซึ่งหมายความว่าเมื่อคุณสมัคร:
auto r = ref(x);
สิ่งนี้ส่งคืน a reference_wrapper
และไม่ใช่การอ้างอิงโดยตรงไปยังx
(ie T&
) นี้reference_wrapper
(คือr
) T&
แทนถือ
A reference_wrapper
มีประโยชน์มากเมื่อคุณต้องการเลียนแบบreference
วัตถุที่สามารถคัดลอกได้ (สามารถคัดลอกได้ทั้งแบบสร้างได้และสามารถคัดลอกได้ )
ใน 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&
ฉันหวังว่าคำตอบนี้จะเพียงพอที่จะอธิบายข้อสงสัยของคุณ