Question :
Quand le destructeur d'un objet temporaire est-il appelé lorsqu'il est créé dans un appel de fonction mais non utilisé comme paramètre ? Plus précisément, considérons le code suivant :
class StringBuffer { public: StringBuffer(std::string & str) : m_str(str) { m_buffer.push_back(0); } ~StringBuffer() { m_str = &m_buffer[0]; } char * Size(int maxlength) { m_buffer.resize(maxlength + 1, 0); return &m_buffer[0]; } private: std::string & m_str; std::vector<char> m_buffer; }; std::string mystring; GetString(StringBuffer(mystring).Size(MAXLEN), MAXLEN);
Réponse :
Le destructeur de l'objet StringBuffer temporaire est appelé après l'appel à GetString renvoie.
Selon la norme C (12.2 Objets temporaires), la durée de vie d'un objet temporaire se termine à la fin de l'expression complète qui (a) n'apparaît pas elle-même comme un opérande (sauf dans la construction d'un objet de classe) dans une autre expression complète, et (b) ne fait pas partie d'une expression entre parenthèses.
Dans l'exemple de code, l'appel à GetString est l'expression complète et l'objet StringBuffer temporaire est créé dans cette expression. Par conséquent, la durée de vie de l'objet temporaire se termine après le retour de l'appel à GetString.
Cette garantie à vie garantit que l'objet temporaire reste valide jusqu'à ce qu'il ne soit plus nécessaire. Il permet aux modèles d'expression de contenir des références à des objets temporaires, car les temporaires dureront jusqu'à ce que l'expression soit complètement évaluée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!