I really dislike how C++ does move semantics. I understand why it is this ugly and difficult (as always: in order not to break existing codebases...), but that doesn't change how mentally taxing it is to write code that avoids unnecessary copies.
I would really love to use Rust instead. There it is trivial, because of the different ownership and lifetime rules. (And in the few cases where move doesn't work, the borrow checker poilitely asks for an explicit clone().)