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;
}
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'. –
'std :: forward' devrait (seulement?) Être utilisé avec * les renvois *. Cela n'a aucun effet ici, même si vous corrigez la syntaxe. – HolyBlackCat