まあref
、適切なのオブジェクト作成reference_wrapper
オブジェクトへの参照を保持するタイプ。つまり、申請するとき:
auto r = ref(x);
これはareference_wrapper
を返し、x
(ie T&
)への直接参照ではありません。これreference_wrapper
(つまりr
)は代わりにを保持しますT&
。
Areference_wrapper
は、コピー可能なreference
オブジェクトのをエミュレートする場合に非常に便利です(コピー構築可能とコピー割り当て可能の両方です)。
C ++では、y
オブジェクト(say x
)への参照(say )を作成したら、同じベースアドレスy
をx
共有します。さらに、y
他のオブジェクトを参照することはできません。また、参照の配列を作成することはできません。つまり、このようなコードはエラーをスローします。
#include <iostream>
using namespace std;
int main()
{
int x=5, y=7, z=8;
int& arr[] {x,y,z};
return 0;
}
ただし、これは合法です。
#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;
}
の問題について話すとcout << is_same<T&,decltype(r)>::value;
、解決策は次のとおりです。
cout << is_same<T&,decltype(r.get())>::value;
プログラムをお見せしましょう:
#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;
}
ここを参照して、3つのことを知ることができます。
reference_wrapper
オブジェクトは、(ここでr
)を作成するために使用することができる参照の配列では不可能でしたT&
。
r
実際には実際の参照のように機能します(r.get()=70
の値がどのように変更されたかを参照してくださいy
)。
r
と同じではありませんT&
が、r.get()
です。これは、つまり、その名前が示すように、参照のラッパーであることを意味しr
ます。T&
T&
この答えがあなたの疑問を説明するのに十分すぎることを願っています。