メンバ変数の参照返しについて
メンバ変数の参照返しについての記事にコメントをいただいたのでEffectiveC++を見直してみたけれど、ローカル変数の参照を返すべきではない、というようなことしか書いていなかった。
class Foo { public: void fuga(); }; class Hoge { public: const Foo& foo(){return foo_;} private: Foo foo_; };
において参照を返す場合のデメリットというのを一応考えてみた。
const参照なので、メンバのfooをコピーせずに、fugaを呼び出すと
(hoge.foo()).fuga();//コンパイルエラー
当然constじゃないメンバ関数を呼びだそうとすればコンパイルエラーになってしまう。デメリットとしては一時オブジェクトとして受け取った変数から更にconstじゃないメンバ関数/変数を呼び出せないということではないだろうか。
ただ、これは一時オブジェクトの寿命問題とともに
...
{//寿命設定用のスコープ。
Foo tmp = hoge.foo();
tmp.fuga();
}
...
のように書けばいい話で、それほどデメリットのようには感じ無い(普段constなメンバしか呼び出さない場合。必要な時にコピーすれば良いだけ)。
というわけで、今のところconst参照を返したほうが便利そうな気がする。さてはて・・・やっぱりメンバ変数の参照返しのデメリットってなんなのだろうか?ううむ.....
>>追記
コメントにて指摘していただいたので修正します。
メンバ関数
const Foo& foo();
は
const Foo& foo()const;
であるべきだと思ってます。うっかりしてました....