Well erstellt refein Objekt des entsprechenden reference_wrapperTyps, um einen Verweis auf ein Objekt zu enthalten. Was bedeutet, wenn Sie sich bewerben:
auto r = ref(x);
Dies gibt einen reference_wrapperund keinen direkten Verweis auf x(dh T&) zurück. Dies reference_wrapper(dh r) gilt stattdessen T&.
A reference_wrapperist sehr nützlich, wenn Sie referenceein Objekt emulieren möchten, das kopiert werden kann (es ist sowohl kopierkonstruierbar als auch kopierzuweisbar ).
In C ++, wenn Sie einen Verweis (sagen wir erstellen y) zu einem Objekt (sagen wir x), dann yund xteilen die gleiche Basisadresse . Darüber hinaus ykann nicht auf ein anderes Objekt verweisen. Sie können auch kein Array von Referenzen erstellen, dh Code wie dieser löst einen Fehler aus:
#include <iostream>
using namespace std;
int main()
{
int x=5, y=7, z=8;
int& arr[] {x,y,z}; // error: declaration of 'arr' as array of references
return 0;
}
Dies ist jedoch 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;
}
/* OUTPUT:
5 7 8
*/
Wenn Sie über Ihr Problem sprechen cout << is_same<T&,decltype(r)>::value;, lautet die Lösung:
cout << is_same<T&,decltype(r.get())>::value; // will yield true
Lassen Sie mich Ihnen ein Programm zeigen:
#include <iostream>
#include <type_traits>
#include <functional>
using namespace std;
int main()
{
cout << boolalpha;
int x=5, y=7;
reference_wrapper<int> r=x; // or auto r = ref(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;
}
/* Ouput:
true
true
true
70
*/
Hier lernen wir drei Dinge kennen:
Ein reference_wrapperObjekt (hier r) kann verwendet werden, um ein Array von Referenzen zu erstellen, mit denen dies nicht möglich warT& .
rverhält sich tatsächlich wie eine echte Referenz (sehen Sie, wie r.get()=70sich der Wert von geändert haty ).
rist nicht dasselbe wie T&aber r.get()ist. Dies bedeutet, dass rgilt, T&dh wie der Name schon sagt, ein Wrapper um eine Referenz ist T& .
Ich hoffe, diese Antwort ist mehr als genug, um Ihre Zweifel zu erklären.