2017-09-01 4 views
1

Le code suivant ne compile pas car T est maintenant déduit pour être une référence (soit une valeur l, soit une valeur r, mais ceci n'est pas pertinent ici). Donc std::vector ne peut plus prendre T comme argument. Est-ce que quelqu'un sait un moyen de résoudre ce problème? Merci!comment est-ce que je passe le paramètre de modèle correctement?

template<typename T> 
void func(T&& t) 
{ 
    std::vector<T> v; 
} 

Réponse: utiliser std::decay comme commenté.

+2

Veuillez fournir un [MCVE] qui produit le problème que vous rencontrez. –

+4

utilisez ['std :: decay'] (http://fr.cppreference.com/w/cpp/types/decay) – SirGuy

+0

Merci SirGuy! Ça a marché! – Dave

Répondre

1

La façon dont les arguments avec des types déduits sont déclarés dépend de la façon dont vous envisagez d'utiliser l'argument. Dans la déclaration qui figure vous déclarez l'argument comme argument référence qui en déduit le modèle de transfert selon la façon dont la fonction est appelée:

  • si la fonction est appelée avec un lvalue de type X l'argument T sera X&
  • si la fonction est appelée avec un rvalue de type X l'argument T seront X

l'argument résultant est inte DEMVSO être transmis quelque part et est très probablement utilisé à l'aide

std::forward<T>(t) 

Si vous consommez plutôt votre argument (c.-à-argument est creux quelque part) vous êtes probablement battre hors de le prendre par la valeur (c.-à-vous » d utiliser f(T t)) et std::move(t) la valeur dans sa destination finale. Vous voudrez peut-être lire l'argument mais ne pas le consommer, auquel cas vous devriez probablement le passer comme T const&.

En supposant que l'utilisation d'une référence de renvoi est intentionnelle, vous devez déclarer std::vector avec un type correspondant obtenu du type déduit, par ex.

std::vector<std::decay_t<T>> v;