2012-06-19 2 views
0

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.

+0

Si vous avez deux questions distinctes, faites deux messages séparés. –

+1

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/ –

+0

@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

Répondre

2

const références gardent la référence en vie (même si elle aurait sorti hors de portée normalement) jusqu'à ce que la référence const est hors de portée

Pour la deuxième question: oui, vous pouvez retourner une référence const, et la valeur de retour de la fonction devra être associée à une référence const

+0

okay. 'opérateur const std :: string &() const' fonctionne (dans VS2010 et gcc4). Je ne m'attendais pas à ça, mais ça marche. Cependant, on ne peut pas avoir les deux (avec et sans référence). THX! – Frunsi

+0

@Frunsi: Je crois ne pas avoir de conversions de types implicites ... mais si vous allez les offrir, il est préférable dans votre cas de fournir le 'const std :: string &', car cela permet à l'appelant de décider s'il veut copier la chaîne ou non. –

+0

@ DavidRodríguez-dribeas: oui, c'est vrai, je ne crois pas non plus aux conversions de type implicites. Mais ici, dans mon cas d'utilisation spécial, c'est très pratique. Cependant, je suis toujours extrêmement surpris, qu'un opérateur de cast de type retournant une référence const fonctionne juste. Je suis sûr, n'importe quel compilateur a du mal à les supporter (parce que les références ne sont pas seulement des types, mais ont une signification spéciale, comme sa durée de vie étendue, etc.) – Frunsi

Questions connexes