Thus the copy constructor is not called. You can comment it out and everything will work fine.
Normally you don't need to write your own copy constructor because the compiler generates one if necessary. The non const copy constructor prevents this.
Which means it can be used left of the assignment. A temporary object like cmplex(2,3) is not an lvalue hence you cannot pass it to a non const reference.