:
inline X operator+(X lhs, const X& rhs)
r-, lvalues . lvalues lhs, x lhs, prvalues lhs.
lhs lhs const& , +. :
+====================+==============+=================+
| | X const& lhs | X lhs |
+--------------------+--------------+-----------------+
| X sum = a+b; | 1 copy | 1 copy, 1 move |
| X sum = X{}+b; | 1 copy | 1 move |
| X sum = a+b+c; | 2 copies | 1 copy, 2 moves |
| X sum = X{}+b+c; | 2 copies | 2 moves |
| X sum = a+b+c+d; | 3 copies | 1 copy, 3 moves |
| X sum = X{}+b+c+d; | 3 copies | 3 moves |
+====================+==============+=================+
const&, . - . . - , , lvalue, ( xvalues).
- , - const&, , , .
, , , :
X operator+(X const& lhs, X const& rhs) {
X tmp(lhs);
tmp += rhs;
return tmp;
}
X operator+(X&& lhs, X const& rhs) {
lhs += rhs;
return std::move(lhs);
}
, . , .