Well ref은 객체에 reference_wrapper대한 참조를 보유하기 위해 적절한 유형의 객체를 생성합니다. 즉, 신청할 때 :
auto r = ref(x);
이것은 (즉 )에 reference_wrapper대한 직접 참조가 아닌 a를 반환합니다 . 이것은 (즉 ) 대신 유지 됩니다.xT&reference_wrapperrT&
A reference_wrapper는 reference복사 할 수있는 객체 를 에뮬레이션하려는 경우 매우 유용합니다 ( 복사 구성 가능 및 복사 할당 가능 ).
C에서 + +, 당신은 참조 (예를 들어 생성되면 y객체 (말을) x한 후,) 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;
}
여기에서 우리는 세 가지를 알게됩니다.
reference_wrapper오브젝트 (여기 r)를 생성하는데 사용될 수있는 참조의 배열 로 할 수 없었다 T&.
r실제로 실제 참조처럼 작동합니다 ( r.get()=70의 값이 어떻게 변경 되었는지 참조 y).
r동일하지 T&않지만 r.get()있습니다. 이 수단을 r보유하고 T&그 이름에서 알 수 있듯이 예는 것입니다 참조 주위 래퍼 T& .
이 답변이 귀하의 의심을 설명하기에 충분하기를 바랍니다.