Насколько вы полагаетесь на оптимизацию компилятора ?
Скажем даже MSVC подтянулся с оптимизацией:
MSVC Improving Copy and Move Elision.
Однако, стандарт не гарантирует нам отсутствие копирования в отличии от гарантий временного объекта.
В идеале хотелось бы проверку на этапе компиляции в отсутствии копирования.
С другой стороны, можно всегда приводить к rvalue и получить гарантировано отсутствие копирования, правда с гарантированным перемещением, которого не будет в случае NRVO.
struct MyType { ... };
MyType might_copy() {
MyType m;
// много-много кода
return m;
}
MyType always_move() {
MyType m;
// много-много кода
return std::move(m);
}