Well ref
은 객체에 reference_wrapper
대한 참조를 보유하기 위해 적절한 유형의 객체를 생성합니다. 즉, 신청할 때 :
auto r = ref(x);
이것은 (즉 )에 reference_wrapper
대한 직접 참조가 아닌 a를 반환합니다 . 이것은 (즉 ) 대신 유지 됩니다.x
T&
reference_wrapper
r
T&
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&
.
이 답변이 귀하의 의심을 설명하기에 충분하기를 바랍니다.