2010-06-17 5 views
1

Les gars que j'ai demandé il ya quelques jours a question et je n'ai pas vraiment eu le temps de le vérifier et d'y penser, mais maintenant j'ai essayé l'une des solutions et je n'arrive pas à comprendre pourquoi ça marche? Je veux dire, pourquoi est appelé à destructor la fin de la ligne comme celui-ci:Qu'est-ce qui détermine quand un destructeur est appelé pour un objet temporaire en C++?

#include "stdafx.h" 
#include "coutn.h" 
#define coutn coutn() 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    coutn << "Line one " << 1;//WHY DTOR IS CALLED HERE 
    coutn << "Line two " << " and some text."; 
    return 0; 
} 

Je suppose qu'il a quelque chose à voir avec la vie d'un objet, mais je ne sais pas quoi et comment. Quand j'y pense, deux objets sans nom sont créés, mais ils ne sortent pas du cadre, donc je ne peux pas comprendre pour quelle raison ils sont appelés.
Merci.

+1

dépend entièrement de ce qui est dans 'coutn.h' et/ou' stdafx.h'. –

+0

Le lien vous indique ce que contient 'coutn.h'. –

+1

@Peter Alexander: Comment? C'est une question avec beaucoup de réponses; Il n'y a pas une seule référence à 'coutn.h' dans la page entière. –

Répondre

7

coutn() créer un objet temporaire, qui sera détruit au point de séquence suivant (la fin de la ligne dans ce cas).

+0

@Peter mais pourquoi cet objet est-il temporaire? Et même si j'écris quelque chose comme ceci: auto tmp = coutn << "Line one" << 1; ça marche toujours. –

+0

@ A-ha: Lorsque le compilateur détecte qu'un objet sera (et peut) ** pas ** être utilisé plus longtemps, il appelle le destructeur. Habituellement, cela se produit à la fin des blocs ou, comme l'a dit Peter, des points de séquence. Dans le cas que vous décrivez, si 'tmp' n'est pas utilisé par la suite, le compilateur peut simplement optimiser les choses et décider qu'il s'agit d'un objet temporaire. – ereOn

+0

@ A-ha: Réponse simple: parce que la norme le dit §12.2/1 * Les temporaires sont créés dans divers contextes ... renvoyant une valeur r * Lorsque vous renvoyez un objet d'une fonction (par rapport à une référence) un Un objet temporaire est créé pour contenir la valeur de retour dans la fonction afin que l'appelant puisse la lire. Maintenant, le compilateur peut optimiser la création de ce temporaire s'il est utilisé pour initialiser un objet du même type dans la fonction appelant auquel cas il ne sera pas détruit, mais s'il est créé il doit être détruit au prochain point de séquence . –

5

La norme dit:

objets temporaires sont détruits comme la dernière étape dans l'évaluation de la pleine expression (lexicalement) contient le point où ils ont été créés.

Une pleine expression est une expression qui n'est pas une sous-expression d'une autre expression

Questions connexes