Предполагая:
R& operator+=(R& r, const V& v);
R& operator+=(R& r, V&& v);
R operator+=(R&& r, const V& v) { r += v; return std::move(r); }
R operator+=(R&& r, V&& v) { r += std::move(v); return std::move(r); }
мы должны иметь:
R operator+(R r, V const& v) { return std::move(r)+=v; }
R operator+(R r, V && v) { return std::move(r)+=std::move(v); }
R operator+(V const& v, R r) { return std::move(r)+=v; }
R operator+(V && v, R r) { return std::move(r)+=std::move(v); }
где я предполагаю, что R
дешев передвигающийся, в то время как +=
с V&&
лишь незначительно более эффективным, чем V const&
.
Обратите внимание, что возвращаемое значение R operator+=(R&& r, ?)
должно быть значением. Я реализую его в терминах +=(const&,?)
, а затем просто перейду в возвращаемое значение.
Это означает, что вы должны реализовать два оператора +=
за пределами вышеуказанного шаблона.
Если нет никакой выгоды от перемещенного-от V
мы получаем:
R& operator+=(R& r, const V& v);
R operator+=(R&& r, const V& v) { r += v; return std::move(r); }
R operator+(R r, V const& v) { return std::move(r)+=v; }
R operator+(V const& v, R r) { return std::move(r)+=v; }
3 шаблонные, одна фактически реализовано функции.
Если вы не любите R operator+=(R&& r, const V& v)
мы можем переписать это так:
R& operator+=(R& r, const V& v);
R operator+(R r, V const& v) { return std::move(r+=v); }
R operator+(V const& v, R r) { return std::move(r+=v); }
и аналогично для V&&
случаях, если это необходимо:
R& operator+=(R& r, V&& v);
R operator+(R r, V&& v) { return std::move(r+=std::move(v)); }
R operator+(V&& v, R r) { return std::move(r+=std::move(v)); }
Мы делаем копию R
в подписи operator+
, а чем внутренне; если мы все равно его скопируем, возможно, также сделаем это в подписи.
Want speed? Pass by value. - это метод, используемый для удаления перегрузок R const&
и R&&
как избыточных.
связанный: http: // stackoverflow.com/questions/13166079/move-semantics-and-pass-by-rvalue-reference-in-overloaded-арифметика и https://stackoverflow.com/questions/2696156/how-to-reduce-redundant-code-when- add-new-c0x-rvalue-reference-operator-ove – NathanOliver
, чтобы уточнить, является 'V' таким, что выполнение' r + v' выполняется быстрее, если 'v' можно вывести из? –
Я предполагаю, что не копирование v или r быстрее, чем копирование. (Так что, если мне не нужно его копировать, я не должен). Здесь я также предположил, что у меня есть копирование и перемещение конструкторов, поэтому, когда я пишу R (r), он либо копирует его, либо перемещает его, в зависимости от того, является ли r значением r - по крайней мере, это было моим намерением. – Jecke