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.
Rapide explication du code, extremement proche d'un copie-colle de Stroustrup, http://www.research.att.com/~bs/bs_f...unction-object
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); }
:
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 :
Merci a tous, et desole pour mon clavier QWERTY
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![]()
Partager