Duplicata possible:
ne référence const prolonge-t-elle la vie d'un temporaire?
Mon compilateur ne se plaint pas de l'attribution temporaire de la référence const:
string foo() {
return string("123");
};
int main() {
const string& val = foo();
printf("%s\n", val.c_str());
return 0;
}
Pourquoi? Je pensais que la chaîne renvoyée par foo
est temporaire et val peut pointer vers un objet dont la durée de vie est terminée. La norme C++ le permet-elle et prolonge-t-elle la durée de vie de l'objet retourné?
Il s'agit d'une fonctionnalité C++. Le code est valide et fait exactement ce qu'il semble faire.
Normalement, un objet temporaire ne dure que jusqu'à la fin de l'expression complète dans laquelle il apparaît. Cependant, C++ spécifie délibérément que la liaison d'un objet temporaire à une référence à const sur la pile allonge la durée de vie du temporaire à la durée de vie de la référence elle-même, et évite ainsi ce qui serait autrement une erreur de référence pendante commune. Dans l'exemple ci-dessus, le temporaire renvoyé par foo()
vit jusqu'à l'accolade fermante.
P.S: Cela ne s'applique qu'aux références basées sur la pile. Cela ne fonctionne pas pour les références qui sont membres d'objets.
Texte complet: GotW # 88: Un candidat pour le "Const le plus important" par Herb Sutter .