According to the current vision of this question, if the user explicitly provides any function from the Rule of Five (copy constructor, move constructor, copy assignment operator, move assignment operator, destructor), this should ideally lead to automatic suppression of the implicit generation of all other Rule Five functions.
However, for compatibility with existing code, i.e. with the "classic" C ++ 98 behavior, currently (in the C ++ 17 standard) this rule is only partially implemented, in the following "compromise" manner:
- Explicitly provided by the user functions from the "classic" Rule of Three (copy constructor, copying assignment operator, destructor) do not suppress the implicit generation of each other, but suppress the generation of the displacement constructor and the transfer assignment operator.
- The explicitly provided by the user "new" function from the Rule of Five (move constructor, moving assignment operator) suppresses the implicit generation of all other functions from the Rule of Five.
You explicitly provided a moving assignment operator in your code. This made point 2 work, and all other functions of the Rule of Five were removed. If you declared an assignment statement with a parameter of type const Class & , then the copy constructor would not disappear anywhere (according to item 1). But as soon as && appears in your code, you can no longer worry about compatibility with C ++ 98. (A separate question - why did you need such a strange type of parameter const Class && ? What did you try to achieve?)
The behavior described in clause 1 is obsolete and will be abolished in the future. That is, any explicitly provided Rule Five function will suppress the generation of all others. However, as soon as this happens - one can only guess.