Предполагая, что люди не добавляют файлы каждые несколько дней, вы, вероятно, можете добавить модель в верхней части каждого файла. Фактически, если ваша система управления версиями позволяет это, вы, вероятно, можете применить правило, в котором говорится, что каждый файл должен иметь моделью, когда он установлен.
Если подпись:
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&&
для причины, описанные здесь