Yes, the return statement works (and by 'works' I mean decides what code to compile) in three stages:
1) if allowed, perform copy/move elision (unless optimizations are disabled)
2) otherwise, if possible, move
3) otherwise, if possible, copy
(otherwise, fail to compile)