2017-10-09 3 views
0

Je pense que je suis fondamentalement mal compris quelque chose à propos de std :: forward. Jetez un oeil au code suivant - si j'inclus std :: forward, il ne compilera pas, mais s'il est omis, il compile bien. Le point de std :: forward ne peut-il pas être déduit s'il est nécessaire de pousser un l ou une valeur?L'inclusion de std :: forward génère une erreur, mais son omission est compilée. Pourquoi?

#include "boost/optional.hpp" 
#include "iostream" 
template<typename T> 
bool hasArg(const boost::optional<T>& opts) 
{ 
    if (opts) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 


template<typename T, typename ... Ts> 
bool hasArg(const boost::optional<T> & opts,const boost::optional<Ts> & ... rest) 
{ 
    if (opts) { 
     //doesn't work: return hasArg<Ts...>(std::forward<Ts>(rest)...); 
     //works: return hasArg<Ts...>(rest...); 
     return hasArg<Ts...>(rest...); 
    } 
    else 
    { 
     return false; 
    } 
} 


int main() 
{ 
    const boost::optional<int> p = boost::optional<int>(5); 
    const boost::optional<int> q = boost::optional<int>(6); 
    std::cout << hasArg(p, q) << std::endl; 
    return 0; 
} 
+2

Sans rapport avec votre problème, mais vous devriez probablement trouver quelque part qui explique la différence entre (le incorrect) '#include" iostream "' et (le correct) '#include '. –

+1

'std :: forward' devrait (seulement?) Être utilisé avec * les renvois *. Cela n'a aucun effet ici, même si vous corrigez la syntaxe. – HolyBlackCat

Répondre

4

Vous ne même pas besoin de transmettre les arguments, ils sont const& peu importe quoi.

Vous passez le mauvais type à std::forward, c'est le problème. rest... n'a pas les types de Ts..., ils sont const boost::optional<Ts>&....

donc vous devez résoudre ce problème:

std::forward<const boost::optional<Ts>&>(rest)... 

Mais comme mentionné, cela n'a pas de sens du tout, parce qu'il n'y a rien - avant. rest n'est pas une référence de renvoi. (std::forward est utilisé pour conserver la catégorie de valeur, mais dans ce cas, il est toujours le même).