Well ref
construit un objet du reference_wrapper
type approprié pour contenir une référence à un objet. Ce qui signifie que lorsque vous postulez:
auto r = ref(x);
Cela renvoie a reference_wrapper
et non une référence directe à x
(ie T&
). Ceci reference_wrapper
(c'est-à-dire r
) tient plutôt T&
.
A reference_wrapper
est très utile lorsque vous voulez émuler un reference
objet qui peut être copié (il est à la fois constructible et assignable par copie ).
En C ++, une fois que vous créez une référence ( par exemple y
) à un objet ( par exemple x
), puis y
et x
partager la même adresse de base . De plus, y
ne peut faire référence à aucun autre objet. De plus, vous ne pouvez pas créer un tableau de références, c'est-à-dire qu'un code comme celui-ci générera une erreur:
#include <iostream>
using namespace std;
int main()
{
int x=5, y=7, z=8;
int& arr[] {x,y,z};
return 0;
}
Cependant, c'est légal:
#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;
}
En parlant de votre problème avec cout << is_same<T&,decltype(r)>::value;
, la solution est:
cout << is_same<T&,decltype(r.get())>::value;
Laissez-moi vous montrer un programme:
#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;
}
Voyez ici, nous apprenons à connaître trois choses:
Un reference_wrapper
objet (ici r
) peut être utilisé pour créer un tableau de références qui n'était pas possible avec T&
.
r
agit en fait comme une véritable référence (voir comment a r.get()=70
changé la valeur de y
).
r
n'est pas le même que T&
mais r.get()
est. Cela signifie que r
tient T&
ie comme son nom l'indique est un wrapper autour d'une référence T&
.
J'espère que cette réponse est plus que suffisante pour expliquer vos doutes.