2015-06-29 7 views
6

können Sie mir sagen, warum dieser Code funktioniert? Es gibt einen überladenen Operator(), der von replace_if Algorithmus verwendet wird. In der Hauptfunktion habe ich konstantes Objekt der IsEqual-Klasse erstellt, so dass nur konstante Funktionsmitglied verwendet werden sollte. Irgendwie funktioniert die Konstanz nicht und dieser Operator wird aufgerufen.C++ dieses und konstante Objekt

#include <iostream> 
#include <vector> 
#include <algorithm> 

class IsEqual { 
    int value; 
public: 
    IsEqual(int v) : value(v) {} 
    bool operator()(const int &elem){ 
    this->value=6; 
    return elem == value; 
    } 
}; 

int main() 
{ 
    const IsEqual tst(2); 
    std::vector<int> vec = {3,2,1,4,3,7,8,6}; 
    std::replace_if(vec.begin(), vec.end(), tst, 5); 
    for (int i : vec) std::cout << i << " "; 
    std::cout<<std::endl; 
} 

Ergebnis: 3 2 1 4 3 7 8 5

+4

Blick auf die Unterschrift von [ 'replace_if'] (http: // en. cppreference.com/w/cpp/algorithm/replace) und überlegen, wie das Prädikatargument deklariert wird. –

Antwort

11

std::replace_if wird seine eigene Kopie des Objekts tst machen. Es ist nicht erforderlich, es auf const zu beschränken.

Wenn Sie das ursprüngliche Objekt im Algorithmus verwenden möchten, können Sie std::reference_wrapper verwenden. Da es zu einem const Objekt verweisen würde, würde dies zu einem Compiler-Fehler führen, da es dem Betreiber verlangen würde const sein:

std::replace_if(vec.begin(), vec.end(), std::ref(tst), 5);