Я прочитал страницу cppreference, посвященную перегрузке операторов — «операторы двоичной арифметики». Меня смутил комментарий в фрагменте кода, который поощрял передачу по значению, а не по ссылке, для оптимизации компилятора. У меня нет опыта, поэтому я мог пропустить некоторую информацию, но, насколько мне известно, передача по ссылке рекомендуется, когда это возможно, а не по значению.
Первый пример:
Код: Выделить всё
class A {
public:
A& operator+=(A const& rhs) {
/*...*/
return *this;
}
friend A operator+(A lhs, A const& rhs) {
lhs += rhs;
return lhs;
}
};
В этом коде указано, что передача lhs по значению в операторе+ помогает оптимизировать цепное сложение. Насколько я понимаю, это противоречит этому ответу на SO, в котором говорится, что передача по значению предотвращает «оптимизацию именованного возвращаемого значения».
Второй пример:
Код: Выделить всё
inline A operator+(A const& lhs, X const& rhs) {
A a = lhs;
a += rhs;
return a;
}
Во втором примере указано A a = lhs;, что, как поясняется принятым ответом в этой теме, утверждает, что оптимизация первого примера верна, если оператор+ реализован с использованием оператора+=.
Правильна ли оптимизация первого примера, если оператор+ реализован без оператора+=?< /p>
Какая из этих реализаций предпочтительнее с точки зрения вычислительной эффективности, при условии, что второй пример включает «оптимизацию именованного возвращаемого значения»?
Есть ли другая причина предпочитаете одно другому?
Подробнее здесь:
https://stackoverflow.com/questions/785 ... verloading