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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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