Quelle est la différence entre assigner à std :: tie et tuple de références?
Je suis un peu perplexe par ce qui suit n-uplet d'affaires:
int testint = 1;
float testfloat = .1f;
std::tie( testint, testfloat ) = std::make_tuple( testint, testfloat );
std::tuple<int&, float&> test = std::make_tuple( testint, testfloat );
Avec std::tie
il fonctionne, mais en l'assignant directement à la tuple de références ne compile pas, donnant
"erreur: la conversion de ‘std::tuple<int, float>’ non-scalaires de type ‘std::tuple<int&, float&> "demandé"
ou
"pas de conversion définie par l'utilisateur à partir de std::tuple<int, float> std::tuple<int&, float&>"
Pourquoi? J'ai vérifié avec le compilateur si c'est vraiment le même type qui est affecté par cela:
static_assert( std::is_same<decltype( std::tie( testint, testfloat ) ), std::tuple<int&, float&>>::value, "??" );
Qui est évaluée à vrai.
J'ai aussi vérifié en ligne pour voir si c'était peut-être la faute de msvc, mais tous les compilateurs donnent le même résultat.
source d'informationauteur Barabas
Vous devez vous connecter pour publier un commentaire.
La
std::tie()
fonction initialise les membres de lastd::tuple<T&...>
de références où est lestd::tuple<T&...>
ne peut pas être initialisé par un templatorystd::tuple<T...>
. L'opérationstd::tie()
ne et de l'initialisation d'un objet correspondant serait exprimée comme ceci:(évidemment, vous devriez normalement utiliser des valeurs différentes que celles de la déjà variables liées).
Les deux
make_tuple
ettie
permettra de déduire le type retourné par des arguments. Maistie
fera une lvalue de référence selon en déduit le type et lamake_tuple
fera une réelle tuple.Le but de
tie
est de faire un temporaire tuple pour éviter les copies temporaires de lier des objets, le mauvais effet, vous ne pouvez pasreturn
untie
si l'entrée objets sont temporaires locales.Le problème est que le membre de droite
std::make_tuple(testint, testfloat)
ne pas retourner un tableau de références, il retournestd::tuple<int, int>
qui est temporaire, dont les valeurs ne peuvent pas se lier à lvalue-références. Si vous avez besoin d'un n-uplet de références, vous pouvez utiliser la fonction d'assistancestd::ref
:La différence entre cela et
tie
est que les références sont initialisés parstd::tie(a, b)
de la construction.Je pense, parce qu'ils sont de types différents, et il n'y a pas de conversion de l'un à l'autre, mais il est basé sur un modèle exemplaire opérateur d'affectation, qui fonctionne en cas d'égalité.
Vérification du code
suggère, que c'est probablement correct.