Objet detruit deux fois dans un for_each ?
	
	
		Bien le bonjour,
Je viens de tomber sur un `os`, en utilisant pour la premiere fois le for_each de la STL <algorithm>, le destructeur de l'objet function que je lui donne se retrouve appele, par deux fois, a l'interieur du foreach.
Je remercie par avance quelqu'un sachant m'expliquer pourquoi.
	Code:
	
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 
 | #include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
 
class Sum
{
  int val;
 
public:
  Sum() : val(0)
    { cout << "CTOR" << endl; }
  Sum(int i) : val(i)
    { cout << "CTOR int" << endl; }
 
  ~Sum()
    { cout << "DTOR" << endl; }
 
  operator int() const
    { return val; }  // extract value                                                                                                         
 
  int operator()(int i)
    { return val += i; }  // application                                                                                                      
};
 
void    f(vector<int> v)
{
  cout << "START" << endl;
  Sum s = 0;  // initial value 0                                                                                                              
 
  s = for_each(v.begin(), v.end(), s);  // gather the sum of all elements                                                                     
  cout << "the sum is " << s << "\n";
  cout << "STOP" << endl;
}
 
void    g(vector<int> v)
{
  cout << endl << "OR EVEN" << endl << "START" << endl;
  cout << "the sum is " << for_each(v.begin(), v.end(), Sum(0)) << "\n";
  cout << "STOP";
}
 
int main()
{
  vector<int>   v;
 
  v.push_back(21);
  v.push_back(42);
  f(v);
  g(v);
} | 
 Rapide explication du code, extremement proche d'un copie-colle de Stroustrup, http://www.research.att.com/~bs/bs_f...unction-object
:
On applique un for_each a un vector, en lui donnant en troismeme parametre un objet function qui fait la somme de ses elements, la fonction f le fait par une methode, le g par une plus concise mais donnant plus ou moins le meme resultat : le destructeur de Sum est appelle deux fois dans le for_each, une troismeme fois pour la fonction 'f', en toute normalitee, a la sortie du scope.
Voila la sortie : 
	Code:
	
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | START
CTOR int
DTOR
DTOR
the sum is 63
STOP
DTOR
 
OR EVEN
START
CTOR int
the sum is 63
DTOR
DTOR
STOP | 
 Merci a tous, et desole pour mon clavier QWERTY :mrgreen: