По-хорошему, компилятор сам применит move-семантику при возврате значения.
Обсуждение на SO, смотрите абзац Best Practice.
Коротко: return move(x) эквивалентно return(x) при наличии конструктора перемещения.
А при включенной оптимизации у вас даже и перемещения не должно быть - у оптимизатора должно хватить мозгов сделать RVO (оптимизацию возвращаемого значения).
Мораль - у компиялторов есть опция (у gcc -S), которая заставляет генерировать не бинарный код, а ассемблерный листинг. Правильно изучать этот листинг, а не творчество отладчика. Потому как отладочная версия программы и оптимизированная - это
разный код с разным поведением.