Разумно ли возвращение с помощью `std :: move` в случае нескольких операторов возврата?

Я знаю, что обычно не рекомендуется возвращаться с помощью 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;
  }
22
задан leftaroundabout 2 March 2012 в 11:35
поделиться