Я знаю, что обычно не рекомендуется возвращаться с помощью std::move, т.е.
bigObject foo() { bigObject result; /*...*/ return std::move(result); }
вместо простого
bigObject foo() { bigObject result; /*...*/ return result; }
поскольку он мешает оптимизации возвращаемого значения. Но что в случае функции с множеством разных возвратов, особенно что-то вроде
class bar {
  bigObject fixed_ret;
  bool use_fixed_ret;
  void prepare_object(bigObject&);
 public:
  bigObject foo() {
    if(use_fixed_ret)
      return fixed_ret;
     else{
      bigObject result;
      prepare_object(result);
      return result;
    }
  }
};
Я думаю, что в такой функции невозможна нормальная оптимизация возвращаемого значения, так что было бы неплохо добавить
      return std::move(result);
здесь, или я должен делать, а (ИМО уродливее, но спорно)
  bigObject foo() {
    bigObject result;
    if(use_fixed_ret)
      result = fixed_ret;
     else{
      prepare_object(result);
    }
    return result;
  }
