2015-06-29 16 views
6

potresti dirmi perché questo codice funziona? C'è un operatore sovraccarico() che viene utilizzato dall'algoritmo replace_if. Nella funzione principale ho creato un oggetto costante della classe IsEqual, quindi è necessario utilizzare solo membri di funzioni costanti. In qualche modo la costanza non funziona e viene chiamato quell'operatore.C++ questo e oggetto costante

#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; 
} 

risultato: 3 2 1 4 3 7 8 5

+4

Guardate la firma del [ 'replace_if'] (http: // it. cppreference.com/w/cpp/algorithm/replace) e considerare come viene dichiarato l'argomento del predicato. –

risposta

11

std::replace_if farà propria copia dell'oggetto tst. Non è necessario limitare il valore a const.

Se si desidera utilizzare l'oggetto originale nell'algoritmo, è possibile utilizzare uno std::reference_wrapper. Dal momento che sarebbe riferirsi a un oggetto const, questo si tradurrebbe in un errore di compilazione perché richiederebbe l'operatore ad essere const:

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