In an already existing class of a project I am working on I encountered some strange piece of code: The assignment operator calls the copy constructor.
I added some code and now the assignment operator seems to cause trouble. It is working fine though if I just use the assignment operator generated by the compiler instead. So I found a solution, but I'm still curious to find out the reason why this isn't working.
Since the original code is thousands of lines I created a simpler example for you to look at.
#include <iostream> #include <vector> class Example { private: int pValue; public: Example(int iValue=0) { pValue = iValue; } Example(const Example &eSource) { pValue = eSource.pValue; } Example operator= (const Example &eSource) { Example tmp(eSource); return tmp; } int getValue() { return pValue; } }; int main () { std::vector<Example> myvector; for (int i=1; i<=8; i++) myvector.push_back(Example(i)); std::cout << "myvector contains:"; for (unsigned i=0; i<myvector.size(); ++i) std::cout << ' ' << myvector[i].getValue(); std::cout << '\n'; myvector.erase (myvector.begin(),myvector.begin()+3); std::cout << "myvector contains:"; for (unsigned i=0; i<myvector.size(); ++i) std::cout << ' ' << myvector[i].getValue(); std::cout << '\n'; return 0; } The output is
myvector contains: 1 2 3 4 5 but it should be (an in fact is, if I just use the compiler-generated assignment operator)
myvector contains: 4 5 6 7 8
thispointer according to the passed object, either member by member or by using some swap function (see copy-and-swap idiom). The fact that it returns something is only required / meaningful if you do stuff likea = b = corfoo(a = b), i.e. use the result of the assignment expression, but that's not the "main task", so to speak. It's modifying the data of thethispointer, and you're not doing that.