It depends entirely on what it means to "add" your objects. Since your question seems to be of a general nature (where addition may be any operation that can be combined with assignment), I can, off the top of my head, only think of an example with multiplication.
With bignums the multiplication process cannot be done in-place. The destination object must be distinct from the source(s). If not, the multiplication will fail.
I admit that the example isn't perfect. Often, you can avoid asking the question about self-assignment by forcing the issue. A bignum multiply-assign might look like this:
bignum& operator += ( bignum& lhs, const bignum& rhs )
{
return lhs.swap( lhs + rhs ); // lhs = lhs + rhs
}
This leverages the existing operator+ to perform the multiplication to create a temporary result, which is then assigned intelligently using the bignum's swap()
member function (it has one, right?).
Again, this was just an example off the top of my head... and not a perfect one. There might arise situations (and you know how your data is manipulated best) that require a different strategy.
[edit] The good example of avoiding calling delete[]
on a resource was made above. [/edit]
tl;dr
If you need to check for self assignment, do it.
If you don't, then don't.