Well, ref
bir nesneye reference_wrapper
bir referans tutmak için uygun türde bir nesne oluşturur. Bunun anlamı, başvurduğunuzda:
auto r = ref(x);
Bu reference_wrapper
, x
(ie T&
) ' ye doğrudan bir referans değil, a döndürür . Bu reference_wrapper
(yani r
) onun yerine geçerlidir T&
.
Bir reference_wrapper
sen bir taklit istediğinizde çok kullanışlıdır reference
kopyalanabilir bir nesnenin (bu hem kopyalama constructible ve kopya devredilemeyen ).
C ++, referans (diyelim oluşturduktan sonra y
bir nesne (söylemek) x
, sonra) y
ve x
aynı paylaşan taban adresi . Ayrıca, y
başka herhangi bir nesneye atıfta bulunamaz. Ayrıca bir referans dizisi oluşturamazsınız, yani bunun gibi kod bir hata verir:
#include <iostream>
using namespace std;
int main()
{
int x=5, y=7, z=8;
int& arr[] {x,y,z};
return 0;
}
Ancak bu yasaldır:
#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;
}
Sorununuz hakkında konuşmak cout << is_same<T&,decltype(r)>::value;
, çözüm şudur:
cout << is_same<T&,decltype(r.get())>::value;
Size bir program göstereyim:
#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;
}
Buraya bakın, üç şeyi öğreniyoruz:
Bir reference_wrapper
nesne (burada r
) ile mümkün olmayan bir referans dizisi oluşturmak için kullanılabilir T&
.
r
aslında gerçek bir referans gibi davranır ( r.get()=70
değerinin nasıl değiştiğine bakın y
).
r
ile aynı değil T&
ama r.get()
. Bu, r
ie'nin T&
adından da anlaşılacağı gibi bir referansın etrafına sarıldığı anlamına gelir T&
.
Umarım bu cevap şüphelerinizi açıklamak için fazlasıyla yeterlidir.