핵심 개념을 명확히하기 위해 좀 더 기본적인 예를 들어 보겠습니다. std::tie
더 많은 값 (튜플)을 반환하는 함수에 유용 하지만 하나의 값으로도 잘 이해할 수 있습니다.
int a;
std::tie(a) = std::make_tuple(24);
return a; // 24
앞으로 나아 가기 위해 알아야 할 사항 :
다음 단계는 방해가되는 함수를 제거하는 것이므로 코드를 다음과 같이 변환 할 수 있습니다.
int a;
std::tuple<int&>{a} = std::tuple<int>{24};
return a; // 24
다음 단계는 해당 구조 내부에서 일어나는 일을 정확히 확인하는 것입니다. 이를 위해 두 가지 유형의 T
치환기 std::tuple<int>
및 Tr
치환기 std::tuple<int&>
를 생성하고 작업을 위해 최소한으로 줄였습니다.
struct T { // substituent for std::tuple<int>
int x;
};
struct Tr { // substituent for std::tuple<int&>
int& xr;
auto operator=(const T& other)
{
// std::get<I>(*this) = std::get<I>(other);
xr = other.x;
}
};
auto foo()
{
int a;
Tr{a} = T{24};
return a; // 24
}
마지막으로 저는 구조를 모두 제거하는 것을 좋아합니다 (100 % 동등하지는 않지만 우리에게 충분히 가까우며 허용 할 수있을만큼 명시 적입니다).
auto foo()
{
int a;
{ // block substituent for temporary variables
// Tr{a}
int& tr_xr = a;
// T{24}
int t_x = 24;
// = (asignement)
tr_xr = t_x;
}
return a; // 24
}
따라서 기본적으로 std::tie(a)
데이터 멤버 참조를 a
. std::tuple<int>(24)
value가있는 데이터 멤버를 만들고 24
할당은 첫 번째 구조의 데이터 멤버 참조에 24를 할당합니다. 그러나 해당 데이터 멤버는에 바인딩 된 참조 a
이므로 기본적으로에 할당 24
됩니다 a
.