Um das Kernkonzept zu verdeutlichen, reduzieren wir es auf ein grundlegenderes Beispiel. Obwohl std::tiedies für Funktionen nützlich ist, die (ein Tupel) mehr Werte zurückgeben, können wir es mit nur einem Wert gut verstehen:
int a;
std::tie(a) = std::make_tuple(24);
return a; // 24
Dinge, die wir wissen müssen, um vorwärts zu kommen:
Der nächste Schritt besteht darin, die Funktionen zu entfernen, die Ihnen nur im Weg stehen, damit wir unseren Code folgendermaßen umwandeln können:
int a;
std::tuple<int&>{a} = std::tuple<int>{24};
return a; // 24
Der nächste Schritt besteht darin, genau zu sehen, was in diesen Strukturen passiert. Dafür erstelle ich zwei Arten von TSubstituenten für std::tuple<int>und TrSubstituenten std::tuple<int&>, die für unsere Operationen auf das Nötigste reduziert sind:
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
}
Und schließlich möchte ich die Strukturen alle zusammen loswerden (nun, es ist nicht 100% äquivalent, aber es ist nah genug für uns und explizit genug, um es zuzulassen):
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)Initialisiert also im Grunde einen Datenelementverweis auf a. std::tuple<int>(24)Erstellt ein Datenelement mit Wert 24, und die Zuweisung weist der Datenelementreferenz in der ersten Struktur 24 zu. Aber da dieses Datenelement eine Referenz gebunden a, dass im Grunde Abtretungsempfänger 24zu a.