27 votes

Est-il une différence entre des références universelles et de transfert des références?

Un argument de cette fonction aura pour effet de lier à une rvalue reference:

void f(int && i);

Cependant, un argument de cette fonction se lier soit à une rvalue ou une lvalue de référence:

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

J'ai souvent entendu cette visée comme une référence universelle.
J'ai également entendu qu'on appelle un transfert de référence.
Veulent-ils dire la même chose?
Est-il seulement d'un transfert de référence si le corps de la fonction d'appels std::forward?

31voto

Barry Points 45207

Veulent-ils dire la même chose?

Référence universelle était un terme de Scott Meyers a été inventé pour décrire le concept de la prise de référence rvalue d'un cv non qualifiés paramètre du modèle, qui peut en être déduit comme une valeur ou une lvalue de référence.

Au moment de la norme C++ n'ont pas un terme spécial pour ce qui est de la surveillance en C++11 et le rend difficile à enseigner. Cet oubli a été réparé par N4164, qui a ajouté la définition suivante [temp.déduire]:

Un transfert de référence est une référence rvalue d'un cv non qualifiés paramètre du modèle. Si P est un transfert de référence et l'argument est une lvalue, le type "lvalue référence à Un" est utilisé au lieu d'Un pour le type de déduction.

Par conséquent, les deux signifient la même chose, et de la norme C++ terme est de transférer de référence. Le papier lui-même articule pourquoi "transfert de référence" est un meilleur terme que "référence universelle."

Est-il seulement d'un transfert de référence si le corps de la fonction d'appels std::forward?

Nope, ce que vous faites avec un transfert de référence n'est pas pertinent pour le nom. Le concept de transfert de référence se réfère simplement à la façon dont le type T est déduit dans:

template <class T> void foo(T&& ); // <== 

Il n'a pas besoin d'être transférée .

13voto

skypjack Points 5516

Malheureusement, c'est déroutant, mais ils ne sont rien de plus que deux noms pour la même chose.
Référence universelle a été proposé (je suppose) par Meyers loin il y a peu (voir ici par exemple).
Transfert de référence est ramassé directement à partir de la standardese. 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