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

un argument de cette fonction se liera à une référence rvalue:

void f(int && i);

cependant, un argument de cette fonction se liera soit à une référence rvalue soit à une référence lvalue:

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

j'ai souvent entendu parler de référence universelle.

J'ai aussi entendu dire que ça s'appelait une référence.

Veulent-ils dire la même chose?

Est-ce que c'est seulement une référence de redirection si le corps de la fonction appelle std::forward?

25
demandé sur Barry 2016-09-18 01:24:44
la source

2 ответов

veulent-ils dire la même chose?

référence Universelle était un terme que Scott Meyers a inventé pour décrire le concept de prendre une référence de valeur de R à un paramètre de modèle cv-unqualified template, qui peut ensuite être déduite comme une valeur ou une référence de valeur de l.

à l'époque, la norme c++ n'avait pas de terme spécial pour cela, ce qui était une erreur en C++11 et rend l'enseignement difficile. Cet oubli a été réparé par N4164, qui a ajouté la définition suivante à [temp.déduire]:

redirection de référence est une référence rvalue à un paramètre de modèle cv-unqualified template. Si P est une référence de redirection et l'argument est une valeur l, le type "lvalue reference to A" est utilisé à la place de A pour la déduction de type.

par conséquent, les deux signifient la même chose, et le terme standard c++ actuel est renvoi de référence. Le le document lui-même explique pourquoi le terme "renvoi" est meilleur que "référence universelle"."

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

non, ce que vous faites avec une référence de renvoi n'est pas pertinent pour le nom. La référence concept forwarding fait simplement référence à 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 .

29
répondu Barry 2016-09-18 01:41:14
la source

Malheureusement, c'est déroutant, mais ils ne sont rien de plus que deux noms pour la même chose.

La référence universelle a été proposée (je suppose) par Meyers far ago (voir ici par exemple).

La référence de l'expédition est récupérée directement à partir du standardese. C'est tout.

13
répondu skypjack 2016-09-18 01:32:19
la source