Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

C++でstd::stringをどう返すべきか Part3

スポンサードリンク

もはやタイトルから脱線しかかってきました。
C++11がらみのお話です。ただしRVO/NRVOはC++03でも使える…というか
コンパイラ依存です。
とはいってもよほどマイナーかとても古いものを使っていなければ
サポートされているというところでしょうか。
少なくともよほど古くないVC++, gccは大丈夫みたい。
clangは知らないけどさすがに大丈夫かと……。

前回までの記事

RVO/NRVOとムーブコンストラクタの関係について

齊藤 (id:SaitoAtsushi)さんのアドバイスをいただいて
気になってもうちょっと調べてみました。
だがしかし、手を抜いてググるだけにしています。
ちゃんと検証しないとダメですね……。
ここはブログを書いている方のお力を借りました。

ここらあたりを見るとものすごく勉強になりました。右辺値の理解 【三次元日誌】
参照渡し or 値渡し? - yohhoyの日記

関係ないお話ですがはてなでいうカード記法(embedのやつ)にできるものと
そうでないのの違いはなんなんだろう・・・。

関数のローカルで宣言したクラスの変数はどう返すの?

上記サイト等を読んだ結果、僕の解釈では…厳密には違うのかもしれないけれど
基本的にはコンパイラがうまいこと判断できる状況では
RVO/NRVOが効いて、それでもダメな場合はムーブコンストラクタが働いてくれる
というように読めました。
自ら定義したクラスでは自分でムーブコンストラクタ書かなきゃダメってことだけどね。

結局どうすりゃいいのよ!!!

std::stringを返す場合は気にしないことにしておく。
自分で定義したクラスの場合は気が向いたらムーブコンストラクタを書いてあげる……。
自分で定義したクラスの場合は……
コピーコンストラクタ同様に暗黙に定義されるそうです。
あれ、これってコピーコンストラクタと同じ状況でポインタへの変数がメンバーにある場合は
……あれ?ポインタが同じ場所を指していても代入元は破棄されるから問題ないか
……んんん?他に何か考慮が必要なのかな???
うーんこれは調べてみよう。
でも暗黙に定義されるのは嬉しい機能だ。

C++11でより複雑怪奇さを増した感じですが、
何も考えないような僕のような人にも扱える言語に近づいている感はとても感じます。
……といったらC++エキスパートの人にとても怒られそうですが(;´Д`)
ええ、そういうやつはおとなしくJavaかC#でも使え!!って話もごもっともな訳で。

ちゃんと読んでないけど興味深い記事を見つけました。
後で見よう…
C++11時代におけるクラスの書き方 - イグトランスの頭の中(のかけら)
EZ-NET: 右辺値参照とムーブコンストラクタの使い方 - C++ プログラミング

全然関係ない話で恐縮なのですが、
C++ほど言語仕様で使う側も頭を悩ませる言語は他にあるのでしょうか…。
JavaScriptも最初は先入観で何か勘違いしていましたが、
結構、いやかなり奥が深い言語ですよね。
最近は関数型言語に興味を持ち始めました。まだ手を付けていませんが。

C++11用のコーディングのお作法を解説した初心者向けの書籍が出てくれればなぁと
他力本願中です。
例えばクラスの作り方で
コピーコンストラクタ、ムーブコンストラクタ定義の時の注意
基本的には生ポインタ使ってnewするなとか
タイトルだけから判断するに
C++ Primer 5th Editionとかの最新版とかそうなのかなぁ……
でも日本語版出てないよね(゚Д゚;)
英語だと読むスピードと効率落ちるから日本語で読みたいっす。