| ▲ | Fiveplus 11 hours ago | |
Regarding mistake 1: return std::move(local_var), it is worth clarifying why this is technically a pessimization beyond just breaking NRVO. It comes down to the change in C++17 regarding prvalues. > Pre-C++17, a prvalue was a temporary object. > Post-C++17, a prvalue is an initializer. It has no identity and occupies no storage until it is materialized. | ||
| ▲ | HarHarVeryFunny 6 hours ago | parent [-] | |
In C++17 and later, return std::move(local_variable) as opposed to return local_variable is only breaking NRVO (which avoids even having to move, by essentially replacing local_variable with a reference to the variable the caller is assigning the function result to). In C++17 if you do return std::move(local_variable) it will do exactly what you asked for and move the local variable to the return value, which with copy elision means directly to the caller's variable. So, return std::move(local_variable) is only preventing NRVO, it's not preventing a move (even though you shouldn't be asking for a move, because move is not the most efficient way). | ||