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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
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