らんだむな記憶

blogというものを体験してみようか!的なー

ローカルオブジェクトを返す

ロベールのC++教室 - 第44章 テンポラリ -

をチラ見しつつ、改めてローカルオブジェクトの return には色んな意味でちょっと抵抗を感じてしまう。

最後に補足しておくと、VC++だと、テンポラリオブジェクトを参照に代入すると、寿命が参照の寿命にまで引き延ばされるようです。しかし、参照に代入できること自体がVC++固有の機能のようなので、一般的に言えることではないと思われます。

これか・・・これか・・・。なんで「Visual Studio では動きますよ」って渡されたコードが、g++ でビルドすると戻り値を受け取った次の行くらいでクラッシュするのか不思議だったし、規格的にやばそうなのに何で Visual Studio では動くのだろうと思っていたが・・・。処理系がそういう実装をしているのか・・・。

e4836.cpp と同じなんだどうけど、たぶんローカルオブジェクトの参照を返していて、それがたまたま Visual Studio の実装としては動作するしコピーコンストラクタが走らないということでうまうまだったんだろうけど、g++ ではダメですと・・・。昔のことだから覚えてないけど、状況から考えてこの実装だな・・・。2011 年は過ぎていたと思うし、C++11 としてムーブせマンティクスやら右辺値参照を使ってくれていれば良かったのだろうけど・・・。

一時オブジェクトの寿命と右辺値参照、ムーブセマンティクスのお話 - Qiita

これは、const参照で昔からできていたことで、

ということで、実装を書き換えてローカル変数(のコピー)を返させつつ const 参照で受け取るみたいな形にしていたんだっけ・・・。忘れた。

参照 | Programming Place Plus Modern C++編【言語解説】 第12章 にも解説がある。どうも const 参照は扱いが特別らしい・・・くらいでそれ以上は深入りしなかったけど、やっぱよく分からないなぁ・・・。

Qiita 記事の

一時オブジェクト ( = 右辺値 )

という表現が分かりやすくて気に入った。とりあえずこの理解で本を読む時に気をつけてみよう。