マイ整数(その2)
さらに分かったこと
- 戻り値が「const MyInt&」でなく、「MyInt」であってRVOが効く場合もある(というか、後者がふつうだと思うのだが)。たとえば、「return temp += rhs;」を「temp += rhs; return temp;」とするだけでOKだったらしい。これはイカン。わけがわからなくなってきた。
- 「const&」で返すということは、関数内で作成したオブジェクト(temp)の参照を返しているのではないのかねー、と思った方は、私と同意見です。でも、一時オブジェクトに対するconst参照があると、そのオブジェクトは『意外と長生き』するようです。私には説明できません。詳しくは参考URLなどをどうぞ。
- 基本データ型との連携は、以下のような感じで書くのが一時オブジェクト最適化的にはいいらしいです。「10 + x」とかやっても一時オブジェクトの生成がひとつですみます。
template<typename T> inline MyInt<T> operator+ ( const T& lhs, const MyInt<T>& rhs ) { MyInt<T> temp = lhs; temp += rhs; return temp; }