NVRO being optional annoys me. I'm always debating whether I should std::move the return value just in case, but if the compiler performs NVRO (which it probably does), this may be a pessimization right? Ugh.
I think you should never std::move return values. Afaik every modern compiler does NRVO and manually moving prevents it. And on the offchance you need to use a compiler that optimizes less, that one copy most likely is the least of the performance concerns.
Afaik every modern compiler does NRVO and manually moving prevents it.
Yeah this is what bothers me. std::move could make things worse, but not if the alternative is a copy. But you're probably right that any self-respecting compiler nowadays would do NRVO.
Well the test3 example FTA gives a case where NRVO would not happen because of the conditional return value. Are you suggesting that you need not std::move even in this case?