Warum kann das Funktorargument nicht geändert werden?

8
  

Ссылка
  Unäre Funktion, die ein Element aufnimmt   der Bereich als Argument. Dies kann entweder   sei ein Zeiger auf eine Funktion oder ein   Objekt, dessen Klasse überlastet ist   Operator(). Sein Rückgabewert, falls vorhanden,   wird ignoriert.

Nach diesem Artikel habe ich erwartet, dass for_each das als drittes Argument angegebene Objekt tatsächlich ändert, aber es scheint, als ob for_each auf einem temporären Objekt operiert und nicht einmal das ihm übergebene Objekt verändert.

Also, warum wird es auf diese Weise umgesetzt? Es scheint viel weniger nützlich. Oder habe ich etwas falsch verstanden und mein Code enthält Fehler?

%Vor%

Erwartete Ausgabe:

%Vor%

Aber folgende Ausgabe:

%Vor%     
smerlin 20.01.2010, 14:34
quelle

3 Antworten

15

Das Funktionsobjekt wird nach Wert übernommen. for_each gibt das Funktionsobjekt zurück, also wenn Sie es zu:

ändern %Vor%

Sie erhalten die erwartete Ausgabe.

    
James McNellis 20.01.2010, 14:37
quelle
10

Obwohl James Recht hat, verwenden Sie std::accumulate mit %Co_de% wäre wahrscheinlich korrekter:

%Vor%

Mit Ihrer std::multiplies Version müssen Sie den Funktor nicht wirklich kopieren, sondern:

%Vor%

Oder C ++ 0x, zum Spaß:

%Vor%     
GManNickG 20.01.2010 14:48
quelle
0

Die Semantik von For_each passt nicht zu dem, was Sie versuchen zu tun. akkumulieren tut genau das, was Sie versuchen, verwenden Sie stattdessen.

    
Yogesh Arora 20.01.2010 14:52
quelle

Tags und Links