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.