Supposons que nous ayons besoin d'une classe pour l'encapsulation de std :: string, et à part tous les autres détails, elle fournit une conversion automatique vers std :: string, en utilisant un type cast opérateur:Référence à temporaire, qui a été créée par un opérateur de type
class MyWrappedString {
std::string m_value;
/* ... */
public:
inline operator std::string() const {
return m_value;
}
};
Ainsi, l'opérateur renverra une copie de l'objet chaîne enroulée. Mais, pourquoi le code suivant semble-t-il correct?
MyWrappedString x;
const std::string& y = x;
// now, y should be a reference to a temporary, right?
std::cout << "y is: " << y << std::endl;
L'opérateur de conversion retournera une copie temporaire de m_Value, donc const std::string& y = x
va créer une référence à cette copie temporaire.
Pourquoi cela fonctionne-t-il? Je me souviens qu'il y avait une sorte d'extension de la durée de vie des objets référencés, mais je ne suis pas sûr.
Et deuxième question: est-il possible d'avoir un opérateur cast qui renvoie une référence const?
.: par exemple
inline operator const std::string &() const {
return m_value;
}
Alors que le code ci-dessus ne doit pas travailler sur une copie temporaire?
PS: Cette question est un peu liée à: Lifetime of temporaries, mais encore un problème différent.
Si vous avez deux questions distinctes, faites deux messages séparés. –
Herb Sutter sur la question relative aux durées de vie des références const aux temporaires: http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ –
@BenjaminLindley : oui, mais il serait difficile d'expliquer le contexte à deux reprises. Donc, quelqu'un répondant à la question 1 peut probablement répondre à la question 2 aussi :) – Frunsi