By accepting a reference argument, you introduce pointer deref. Wouldn't it be better to use
Widget && temp = complicated_long_function(...);
consume(temp);
Am i missing something?