Well ref
membangun sebuah objek dengan reference_wrapper
tipe yang sesuai untuk menampung referensi ke sebuah objek. Yang artinya saat Anda melamar:
auto r = ref(x);
Ini mengembalikan a reference_wrapper
dan bukan referensi langsung ke x
(yaitu T&
). Ini reference_wrapper
(yaitu r
) sebagai gantinya berlaku T&
.
A reference_wrapper
sangat berguna ketika Anda ingin meniru reference
objek yang dapat disalin (keduanya dapat dikopi-konstruktif dan dapat dialihkan ).
Dalam C ++, setelah Anda membuat referensi (katakanlah y
) ke obyek (katakanlah x
), kemudian y
dan x
berbagi sama alamat dasar . Selain itu, y
tidak dapat merujuk ke objek lain. Anda juga tidak dapat membuat array referensi, misalnya kode seperti ini akan menimbulkan kesalahan:
#include <iostream>
using namespace std;
int main()
{
int x=5, y=7, z=8;
int& arr[] {x,y,z};
return 0;
}
Namun ini legal:
#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;
}
Berbicara tentang masalah Anda dengan cout << is_same<T&,decltype(r)>::value;
, solusinya adalah:
cout << is_same<T&,decltype(r.get())>::value;
Mari saya tunjukkan sebuah program:
#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;
}
Lihat di sini kita mengetahui tiga hal:
Sebuah reference_wrapper
objek (di sini r
) dapat digunakan untuk membuat array referensi yang tidak memungkinkan T&
.
r
sebenarnya bertindak seperti referensi nyata (lihat bagaimana r.get()=70
mengubah nilai y
).
r
tidak sama T&
tetapi r.get()
. Ini berarti bahwa r
holding T&
seperti namanya adalah pembungkus di sekitar referensi T&
.
Saya harap jawaban ini lebih dari cukup untuk menjelaskan keraguan Anda.