Um das Kernkonzept zu verdeutlichen, reduzieren wir es auf ein grundlegenderes Beispiel. Obwohl std::tie
dies 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 T
Substituenten für std::tuple<int>
und Tr
Substituenten 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 24
zu a
.