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.

  1. Sans liaison constante référence à l'objet retourné de get_string.

    process_c_string(get_string().c_str());
    
  2. 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.

Était-ce utile?

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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top