Симметричный оператор + в терминах оператора + = в современном C ++?

Предполагая, что люди не добавляют файлы каждые несколько дней, вы, вероятно, можете добавить модель в верхней части каждого файла. Фактически, если ваша система управления версиями позволяет это, вы, вероятно, можете применить правило, в котором говорится, что каждый файл должен иметь моделью, когда он установлен.

1
задан alfC 9 February 2019 в 07:44
поделиться

1 ответ

Если подпись:

T operator+(T const& a, T const& b )

(как вы говорите в тексте вопроса, выделенном жирным шрифтом), то тело должно быть:

return T(a) += b;

, где объект результата является единственным T построенным. Версия T nrv( lhs ); nrv += rhs; return nrv; теоретически рискует, что компилятор не объединит nrv с объектом результата .


Обратите внимание, что указанная выше подпись не позволяет исключить ни один из аргументов. Если желательно выйти из lhs, то это мне кажется оптимальным:

T operator+(T const& a, T const& b)
{
    return T(a) += b;
}

T operator+(T&& a, T const& b)
{
    return T(std::move(a)) += b;
}

В обоих случаях объект результата гарантированно будет единственным созданным объектом. В «классической» версии, принимающей T a, случай аргумента rvalue повлечет за собой дополнительный ход.

Если вы хотите выйти из правой части, то можно добавить еще две перегрузки:)

Обратите внимание, что я не рассматривал случай возврата T&& для причины, описанные здесь

0
ответ дан M.M 9 February 2019 в 07:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: