Untuk memperjelas konsep inti, mari kita menguranginya menjadi contoh yang lebih mendasar. Meskipun std::tie
berguna untuk fungsi yang mengembalikan (tuple dari) lebih banyak nilai, kita dapat memahaminya hanya dengan satu nilai:
int a;
std::tie(a) = std::make_tuple(24);
return a; // 24
Hal-hal yang perlu kita ketahui untuk maju:
Langkah selanjutnya adalah menyingkirkan fungsi-fungsi yang hanya menghalangi jalan Anda, jadi kami dapat mengubah kode kami menjadi ini:
int a;
std::tuple<int&>{a} = std::tuple<int>{24};
return a; // 24
Langkah selanjutnya adalah melihat dengan tepat apa yang terjadi di dalam struktur tersebut. Untuk ini, saya membuat 2 jenis T
substituen untuk std::tuple<int>
dan Tr
substituen std::tuple<int&>
, dipreteli seminimal mungkin untuk operasi kami:
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
}
Dan akhirnya, saya ingin menyingkirkan semua struktur bersama-sama (yah, ini tidak 100% setara, tetapi cukup dekat bagi kami, dan cukup eksplisit untuk memungkinkannya):
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
}
Jadi pada dasarnya, std::tie(a)
menginisialisasi referensi anggota data ke a
. std::tuple<int>(24)
membuat anggota data dengan nilai 24
, dan tugas menetapkan 24 ke referensi anggota data di struktur pertama. Tapi karena anggota data itu adalah referensi yang terikat a
, yang pada dasarnya ditetapkan 24
ke a
.