27 votes

Y a-t-il une différence entre les références universelles et les références de transmission ?

Un argument à cette fonction sera lié à une référence rvalue :

void f(int && i);

Cependant, un argument à cette fonction sera lié soit à une référence rvalue soit à une référence lvalue :

template <typename T>  
void f(T && t);

J'ai souvent entendu parler d'une référence universelle.
J'ai aussi entendu dire qu'on l'appelait une référence de renvoi.
Signifient-ils la même chose ?
S'agit-il seulement d'une référence de transfert si le corps de la fonction appelle std::forward ?

31voto

Barry Points 45207

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.

13voto

skypjack Points 5516

Malheureusement, cela prête à confusion, mais ce ne sont rien d'autre que deux noms pour la même chose.
La référence universelle a été proposée (je suppose) par Meyers il y a bien longtemps (voir aquí à titre d'exemple).
La référence de renvoi est captée directement à partir du standardisé . C'est tout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X