I feel move ctor (and move-assignment) is extremely implicit and “in-the-fabric”. I don’t know of any common function with a rvr parameter. Such a function is usually in some library, but I don’t know any std lib function like that. Consequently, in my projects I have not seen any user-level code that shows “std::move(…)”
Let’s look at move ctor. “In the fabric” means it’s mostly rather implicit i.e. invisible. Most of the time move ctor is picked by compiler based on some rules, and I have basically no influence over it.
https://github.com/tiger40490/repo1/blob/cpp1/cpp1/rvrDemo.cpp shows when I need to call move() but it’s a contrived example — I have some object (holding a resource via heap pointer), I use it once then I don’t need it any more, so I “move” its resource into a container and abandon the crippled object.
Conclusion — as app developers I seldom write code using std::move.
- P20 [[c++ std lib] shows myCollection.insert(std::move(x)); // where
x is a local nonref variable, not a heap pointer!
- I think you do this only if x has part of its internal storage allocated on heap, and only if the type X has a move ctor.
I bet that most of the time when an app developer writes “move(…)”, she doesn’t know if the move ctor will actually get picked by compiler. Verification needed.
–Here’s one contrived example of app developer writing std::move:
vectorOfString.push_back(std::move(myStr)); //we promise to compiler we won’t use myStr any more.
Without std::move, a copy of myStr is constructed in the vector. I call this a contrived example because
- if input is a char-array, then emplace_back() is more efficient
- if input is another string, then we can simply use push_back(input)