マイ整数(その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;
}
  • 上の例に関しても、「SVOのためにreturnの中でコンストラクタをよべ。一文でかけ。」という(私が理解している範囲の)原則と、反しているような気がします。
  • 要するに、もう少しちゃんと調べる必要がありそうです、ということ。
  • 環境かいてませんでした。g++ (GCC) 4.2.3 (Debian 4.2.3-5) です。