2 votes

Renvoi d'une référence à un fichier temporaire

Je regarde cet exposé de la cppcon17 et j'essaie de reproduire et de comprendre les bugs présentés. Cependant, je ne suis pas en mesure de reproduire/comprendre le bug n°3 de l'exposé (l'horodatage est dans le lien ci-dessus). J'ai écrit cet exemple minimal :

#include <iostream>
#include <map>

const std::string& getDefault(const std::map<int, std::string>& map, const int key, const std::string& defVal) {
    auto pos = map.find(key);
    return (pos != map.end() ? pos->second : defVal);
}

void printer(const std::string& str) {
    std::cout << str << std::endl;
}

int main () {
    std::map<int, std::string> myMap { {1, "dog"}, {2, "cat"}};
    auto& retVal = getDefault(myMap, 3, "pizza");
    printer(retVal);
    return 0;
}

Si je comprends bien le problème, la valeur par défaut temporaire de "pizza" ne devrait pas être renvoyée par référence, car elle devrait être supprimée. Mais pourquoi cet exemple fonctionne-t-il quand même ? Je m'attendais à une erreur due à une référence qui n'est plus valide.

Modifier : J'ai légèrement modifié l'exemple pour souligner que le problème se produit toujours, si le temporaire est sur une autre ligne.

4voto

songyuanyao Points 2265

Ce code, c'est-à-dire std::cout << getDefault(myMap, 3, "pizza") << std::endl; est valable ; le temporaire sera détruit après l'expression complète, c'est-à-dire après l'élément ; la référence retournée reste valide lorsqu'elle est transmise et imprimée par l'utilisateur. operator<< de std::cout .

Tous les objets temporaires sont détruits lors de la dernière étape de l'évaluation de l'expression complète qui contient (lexicalement) le point où ils ont été créés,

EDITAR

Votre code mis à jour a un comportement indéfini. Après le ; l'objet temporaire a été détruit et retVal est suspendu ; toute déréférence sur lui conduit à UB.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X