2015-11-23 2 views
2

Je lis C++ moderne et efficace par Scott Meyersdéduction scott types meyers universels

Pour les références universelles qui sont des paramètres de fonction, l'initialiseur est fourni sur le site d'appel.

template<typename T> 
void f(T&& param); // param is a universal reference. 

Widget w; 
f(w) 

f(std::move(w)); 


template<typename T> 
void f(std::vector<T>&& param); // param is an rvalue reference 

Pour référence universelle, la déduction de type est nécessaire, mais ce n'est pas suffisant. La forme de la déclaration de référence doit également être correcte, et celle de est très limitée. Ce doit être précisément "T&&".

Lorsque f est invoqué, le type T sera déduit (à moins que l'appelant ne le spécifie explicitement, un cas de contour auquel nous ne nous intéresserons pas). Mais la forme de la déclaration de type de param n'est pas "T&&", c'est "std::vector<T>&&". Cela exclut la possibilité que param soit une référence universelle. param est donc une référence rvalue, quelque chose de vos compilateurs sera heureux de vous confirmer si vous essayez de passer une lvalue à f

std::vector<int> v; 
f(v); // error! can't bind lvalue to rvalue reference. 

En haut, j'ai la question suivante

  1. Qu'est-ce que l'auteur entend par "à moins que l'appelant ne le spécifie explicitement, un cas de bord dont nous ne nous occuperons pas"? Demande de donner un exemple ce qui est l'auteur de cas limite est de mentionner que l'appelant spécifie explicitement
+2

* Que dit le auteur signifie par "à moins que l'appelant ... * -' f (w) ' – Amit

+0

Le terme a été plus tard changé en [Référence de transfert] (https://isocpp.org/files/papers/N4164.pdf) –

+0

@ amit est il y a différence dans la déduction de type si l'utilisateur spécifie le type – venkysmarty

Répondre

1

L'auteur fait référence à l'utilisateur final spécifiant explicitement le paramètre de type dans l'appel à f:

f<Widget>(w);