Well erstellt ref
ein Objekt des entsprechenden reference_wrapper
Typs, um einen Verweis auf ein Objekt zu enthalten. Was bedeutet, wenn Sie sich bewerben:
auto r = ref(x);
Dies gibt einen reference_wrapper
und keinen direkten Verweis auf x
(dh T&
) zurück. Dies reference_wrapper
(dh r
) gilt stattdessen T&
.
A reference_wrapper
ist sehr nützlich, wenn Sie reference
ein 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 y
und x
teilen die gleiche Basisadresse . Darüber hinaus y
kann 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_wrapper
Objekt (hier r
) kann verwendet werden, um ein Array von Referenzen zu erstellen, mit denen dies nicht möglich warT&
.
r
verhält sich tatsächlich wie eine echte Referenz (sehen Sie, wie r.get()=70
sich der Wert von geändert haty
).
r
ist nicht dasselbe wie T&
aber r.get()
ist. Dies bedeutet, dass r
gilt, 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.