Why should this be ill-formed? You define two copy constructors, one which expects a non-const argument and the other which can use a const argument. You then tell the compiler it should use its default implementation for these two constructors. Unless the compiler has a reason to eliminate the default copy constructors, you could also delete those two lines and would get the same result. Also I think the first version is redundant, since the default implementation should anyway be fine with a const argument. Still defining both is legal, since you might want to do something different in the two cases.