Um das Kernkonzept zu verdeutlichen, reduzieren wir es auf ein einfacheres Beispiel. Obwohl std::tie
nützlich für Funktionen ist (ein Tupel von) mehr Werte zurückgegeben werden, können wir es verstehen ganz gut mit nur einem Wert:
int a;
std::tie(a) = std::make_tuple(24);
return a; // 24
Dinge, die wir in wissen müssen, um vorwärts zu gehen:
Der nächste Schritt ist dieser Funktionen, um loszuwerden, die nur in die Quere kommen, so können wir unseren Code zu dieser Transformation:
int a;
std::tuple<int&>{a} = std::tuple<int>{24};
return a; // 24
Der nächste Schritt ist, genau zu sehen, was passiert in diesen Strukturen. Dazu erzeuge ich 2 Arten T
Substituent für std::tuple<int>
und Tr
Substituenten std::tuple<int&>
, auf das absolute Minimum für unsere Operationen abgespeckte:
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 Ich mag die Strukturen alle zusammen, um loszuwerden (na ja, es ist nicht zu 100% entspricht, aber es ist nahe genug für uns, und explizit genug, um es zu ermöglichen):
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
}
Also im Grunde initialisiert std::tie(a)
ein Datenelement Bezug auf a
. erstellt ein Datenelement mit dem Wert 24
und die Zuweisung weist der Datenelementreferenz in der ersten Struktur 24 zu. Da dieses Datenelement jedoch eine Referenz ist, die an a
gebunden ist, weist es 24
a
zu.
Wenn das letzte Zeile kompiliert Ich bin ein bisschen besorgt. Es sieht so aus, als würde man einen Verweis auf ein temporäres Objekt binden, was illegal ist. –
@NirFriedman Erhalten Sie in diesem Fall keine Lebensdauerverlängerung? – Neil
@Neil Es muss entweder eine R-Wert-Referenz oder eine Konst-L-Referenz sein. Sie können keine Lvalue-Referenz an einen Prvalue (temporär) binden. Obwohl dies in MSVC seit Jahren eine "Erweiterung" ist. –