web-dev-qa-db-fra.com

Retour d'un objet temporaire et liaison à la référence const

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é?

60
gruszczy

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 .

69
Sergey K.