In order to get rid of these problems, the rule of three was expanded to the rule of five.
To be specific, in addition to the copy-constructor and copy-assignment, we now also have move-constructor and move-assignment.
Instead of taking a const reference as a parameter, the move versions accept a Buffer&& object.
The && modifier indicates that the parameter is an object which we intend to move from instead of copying it. Speaking in C++ terms, this is called an r-value and we will talk a little bit more about those later.
Whereas the copy functions copy an object, the move equivalents are intended to move resources from one object to another, freeing the moved-from object from the resource.