Untuk memperjelas konsep inti, mari kita menguranginya menjadi contoh yang lebih mendasar. Meskipun std::tieberguna 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 Tsubstituen untuk std::tuple<int>dan Trsubstituen 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 24ke a.