L'objet temporaire sera-t-il supprimé s'il n'y a pas de référence const?
-
14-11-2019 - |
Question
Jetons un coup d'œil à ces deux fonctions:
std::string get_string()
{
std::string ret_value;
// Calculate ret_value ...
return ret_value;
}
void process_c_string(const char* s)
{
std::cout << s << endl;
}
Et voici deux appels possibles de process_c_string
avec un argument renvoyé par get_string
.
Sans liaison constante référence à l'objet retourné de
get_string
.process_c_string(get_string().c_str());
Avec une référence constante de constant à l'objet retourné de
get_string
.const std::string& tmp_str = get_string(); process_c_string(tmp_str.c_str());
Je sais que la deuxième voie est valable, mais qu'en est-il du premier, que dit la norme de cette affaire? L'objet temporaire est-il renvoyé par get_string
être supprimé avant process_c_str
fini à cause de ce n'est pas const reference
Pour ça?
Noter: Les deux versions sont correctes dans MSVC.
La solution
La durée de vie du temporaire s'étend pour la longueur de l'expression complète dans laquelle il a été créé. Dans votre cas, le temporaire sera détruit mais seulement après l'appel à process_c_string
complète. Tant que la fonction ne stocke pas le pointeur pour une utilisation ultérieure, vous allez bien.
Dans le deuxième cas (liaison de référence), la durée de vie de ce temporaire est étendue pour être la portée de la référence, mais je conseillerais contre ce modèle dans ce cas particulier. Vous obtenez le même effet en créant une chaîne locale initialisée avec le temporaire et le code est plus simple. (Du point de vue de la performance, tous les compilateurs éliminent la copie supplémentaire potentielle dans le code, donc le coût serait le même)