Hello Alexei,
You can introduce a new class, say, cl_UP_coefficients or cl_UP_embryo, that has a set_coeff method and a finalize method that returns a cl_UP. cl_UP will lose these methods, but have a constructor that takes a cl_UP_coefficients argument.
Changing the coefficients is a common operation (think of division, GCD, etc). So this crippled^W immutable cl_UP is next to useless.
Indeed, division and GCD can become a lot slower if in-place modification of polynomial is impossible. Then I agree with you, for option 2.
and provide a separate function for "deep copying" of a polynomial.
What about a copy constructor?
The copy-constructor and the assignment operator should always do the same thing in C++. People won't understand if cl_UP a = ...; cl_UP b = a; and cl_UP a = ...; cl_UP b; b = a; behave differently. And in CLN these simple assignments are only copying a simple reference, not the deep contents (see the other mail). Bruno