D'un autre point de vue, lorsqu'il s'agit de rvalues dans une affectation de référence universelle, il peut être souhaitable de préserver le type d'une variable tel qu'il est. Par exemple
auto&& x = 2; // x is int&&
auto&& y = x; // But y is int&
auto&& z = std::forward<decltype(x)>(x); // z is int&&
Utilisation de std::forward
nous avons veillé à z
a exactement le même type que x
.
De plus, std::forward
n'affecte pas les références lvalue :
int i;
auto&& x = i; // x is int&
auto&& y = x; // y is int&
auto&& z = std::forward<decltype(x)>(x); // z is int&
Toujours z
a le même type que x
.
Donc, pour en revenir à votre cas, si la fonction interne a deux surcharges pour les éléments suivants int&
y int&&
vous voulez passer des variables comme z
affectation non y
un.
Les types de l'exemple peuvent être évalués via :
std::cout<<is_same_v<int&,decltype(z)>;
std::cout<<is_same_v<int&&,decltype(z)>;