Signifient-ils la même chose ?
Référence universelle est un terme inventé par Scott Meyers pour décrire le concept de prise d'une référence rvalue à un paramètre de modèle cv-unqualified, qui peut ensuite être déduit comme une valeur ou une référence lvalue.
À l'époque, la norme C++ n'avait pas de terme spécial pour cela, ce qui a été un oubli dans C++11 et rend l'enseignement difficile. Cet oubli a été corrigé par N4164 qui a ajouté la définition suivante à [temp.deduct] :
A référence de transfert est une référence rvalue à un paramètre de modèle cv-unqualified. Si P
est une référence de transfert et l'argument est une lvalue, le type "référence de lvalue à A" est utilisé à la place de A pour la déduction du type.
Par conséquent, les deux signifient la même chose, et le terme standard actuel du C++ est forwarding reference. L'article lui-même explique pourquoi "forwarding reference" est un meilleur terme que "universal reference".
S'agit-il seulement d'une référence de transfert si le corps de la fonction appelle std::forward
?
Non, ce que vous faites avec une référence de transfert n'a rien à voir avec le nom. Le concept de référence de transfert fait simplement référence à la manière dont le type T
est déduit dans :
template <class T> void foo(T&& ); // <==
Il n'est pas nécessaire de le faire suivre ultérieurement.