コピーコンストラクタだと、さきほどのように2重delete問題が起こってしまうのです。(2回&が付いてますが間違ってません!)はconstじゃないので、itを書き換えられます。とお思いでしょうが、それでいいのです。ムーブ=移動ですからね。自分は死ぬ代わりに、相手にポインタを託す、そんなものです。呼び出す側について考えてみましょう。要はムーブしたいときは、コピーとは違って、P&&型にキャストすれば良いのです。ムーブされる}もちろん、いくら初心者でもこのような書き方はC++を書くものとして許されません。ムーブされる}と書きます......が、実は&&にキャスとしてくれる便利な関数が標準で用意されています。}ムーブしているのが見た目に分かりやすいですね。pはムーブされたのでpの中のsはnullptrになっています。nullptr;が実行されるわけですが、deleteはnullptrを渡してもよく、その場合は何も起こらないので正しい挙動です。重要なのは、ムーブ後のデータは、デストラクタで正しく、それもなるべく高速に解体されることが望まれます。この場合は相手のポインタをnullptrにすることで、2重deleteされず(正しく)、高速に(nullptrチェックも要らずに)解体されるのです。右辺値参照ところでこの&&は何物かというと、右辺値参照と言います。右辺値をコンストラクタに渡すとムーブしてくれます。右辺値にするための便利な関数がstd::moveです。話を戻して次の例を見ましょう。"初期化に失敗しました。ムーブするからnewしない}最後のstd::move(p)に注目ですが、実はこのstd::moveは要りません。return後はローカル変数pは不要なのでmoveしても何も問題が無いからです。仕様で右辺値扱いされます。"初期化に失敗しました。ムーブしてくれる}実はこのように何も書かないとコンパイラが最適化してムーブすらしない場合があります。コンストラクタのみ実行され、それが利用されるのです。これは自分で調べてみて下さい。本記事はhttps://twitter.com/staryoshi/status/66976373161043...2015-10-29scope_exitをmoveできるようにしたmovable_scope_exitを実装scope_exitでは、その変数を定義したスコープを抜けたときの処...2015-10-28scope_exitの実装スコープを抜けたら何らかの処理を実行する物を作りました。)はてなブログをはじめよう!staryoshiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。