Utiliser une fonction ayant pour paramètre une référence de rvalue
Bonjour,
J'ai besoin d'utiliser la fonction value_or (librairie tomlplusplus). Pour simplifier, disons que j'ai besoin de l'appeler sur un bool.
Voici la fonction que je veux écrire :
Code:
1 2 3 4 5 6 7
| auto toml::node::value_or(T&& default_value) const; // Signature de value_or
// Ma fonction
bool lireAvecValeurParDefaut(toml::table& t, const string& nomVal, bool defaut) {
// Lit une valeur dans un table et la retourne, si la valeur n'existe pas elle retourne une valeur par défaut
return t[nomVal].value_or<bool>(defaut);
} |
Problème, cette fonction ne marche pas vu que dans value_or, default_value doit être une référence de rvalue.
Je ne connaissais pas bien cette notion mais de ce que j'en ai compris les type T&& permettent de s'assurer que la ressource est temporaire et que la mémoire utilisée peut être récupérée par la fonction (n'hésitez pas à me corriger).
J'ai deux versions alternatives de ma fonction qui marchent, mais qui sont plus ou moins satisfaisantes :
Code:
1 2 3 4
| bool lireAvecValeurParDefaut(toml::table& t, const string& nomVal, bool defaut) {
return t[nomVal].value_or<bool>(bool(defaut)); // Version 2
return t[nomVal].value_or<bool>(std::move(defaut)); // Version 3
} |
Je préfère la version 3 parce que (sauf erreur de ma part) la version 2 fait une copie supplémentaire. Néanmoins, la version 3 mais ça m'a l'air "inutilement compliquée" et moins lisible que ma version initiale.
Par exemple, j'avais pensé à faire passer "defaut" comme une référence de rvalue :
Code:
bool lireAvecValeurParDefaut(toml::table& t, const string& nomVal, bool&& defaut)
Mais là non plus ça ne fonctionne pas, vu qu'il estime que defaut peut être utilisée ailleurs dans ma fonction (si j'ai bien compris).
Donc voici ma question, est-il possible de faire autrement que ces deux solutions qui marchent ? Est ce qu'il y a quelque chose de fondamental qui m'échappe ?
Merci d'avance