6

could you tell me why this code works? There is overloaded operator() which is used by replace_if algorithm. In main function I've created constant object of IsEqual class so only constant function member should be used. Somehow constancy isn't working and that operator is called.

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

result: 3 2 1 4 3 7 8 5

Joker
  • 63
  • 5
  • 4
    Look at the signature of [`replace_if`](http://en.cppreference.com/w/cpp/algorithm/replace) and consider how the predicate argument is declared. – Jonathan Wakely Jun 29 '15 at 14:10

1 Answers1

11

std::replace_if will make its own copy of the tst object. It is not required to restrict it to be const.

If you want to use the original object in the algorithm, you can use an std::reference_wrapper. Since it would be referring to a const object,this would result in a compiler error because it would require the operator to be const:

std::replace_if(vec.begin(), vec.end(), std::ref(tst), 5);
juanchopanza
  • 223,364
  • 34
  • 402
  • 480