Afin de clarifier le concept de base, réduisons-le à un exemple plus élémentaire. Bien que std::tie
est utile pour les fonctions qui renvoient (un tuple de) plusieurs valeurs, nous pouvons très bien le comprendre avec une seule valeur :
int a;
std::tie(a) = std::make_tuple(24);
return a; // 24
Des choses que nous devons savoir afin d'aller de l'avant :
L'étape suivante consiste à se débarrasser de ces fonctions qui ne font que vous gêner, de sorte que nous pouvons transformer notre code en ceci :
int a;
std::tuple<int&>{a} = std::tuple<int>{24};
return a; // 24
L'étape suivante consiste à voir exactement ce qui se passe à l'intérieur de ces structures. Pour cela, je crée 2 types T
pour std::tuple<int>
et Tr
substituant std::tuple<int&>
réduit au strict minimum pour nos opérations :
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
}
Et enfin, j'aime me débarrasser des structures toutes ensemble (enfin, ce n'est pas 100% équivalent, mais c'est assez proche pour nous, et assez explicite pour le permettre) :
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
}
Donc, en gros, std::tie(a)
initialise une référence de membre de données à a
. std::tuple<int>(24)
crée un membre de données avec la valeur 24
et l'affectation attribue 24 à la référence de l'élément de données dans la première structure. Mais comme ce membre de données est une référence liée à a
qui, en fait, attribue 24
à a
.