質問: static_cast&&>(ptr); std::cout << *str << std::endl; ``` できます。 問題なく動作しています。 つまり・・・ **このムーブというのは「文法上のだたの見せかけ」に過ぎないのではないでしょうか?** 内部動作的に、「ムーブというものは存在しない」ということだと思うのですが・・ **そもそもムーブって必要なんでしょうかね??** **右辺値化するだけなのであればキャストで良いのでは??** かえってムーブなどあるとわかりにくさが増しそうですが・・・ (ああ、ちなみに、std::unique_ptrのデストラクタは所有権を移動する時に呼ばれるのではなく、関数終了時に呼ばれていました。 所有権を移動して、もう使わなくなったのなら、その時点でデストラクタを呼び出しても良いような気がしますが・・・) 分かる方いたら教えてください。 ムーブと一緒に出てくる右辺値参照については、再度質問いたします。 GCC Linux です。
回答: **「右辺値」「左辺値」という言葉を忘れる。それらは言葉そのものが間違いだ** すでに回答が出ているので十分な気もしますが、私もQiitaに前にこの件については記事を書いているので貼っておきます。 みんなlvalueとrvalueを難しく考えすぎちゃいないかい? 要点としては rvalueならば所有権を持たないという社会的合意が存在する →所有権を持たないならば対象オブジェクトをいかに書き換えようとも文句は言われない。 が前提。 move semanticsとは動的確保した領域を指すなどしている、ポインタがクラスメンバーにあるとき、このポインタを単純にコピーすること(新たにメモリー確保してポインタの指す先までcopyしたりはしない)。 moveはいつでも安全なわけではない。ではいつならmoveしていいのか?所有権を持っていないオブジェクトに対してだ。言い換えると、rvalue referenceに対してはmoveを行っても安全である。 lvalueの所有権を放棄したと偽装するにはrvalue referenceにキャストすれば良い。 しかし、キャストを毎回書くのはめんd。プログラマーは怠惰であるべきだ。 ここでrvalue referenceを返す関数の呼び出しの評価結果はrvalueである、という性質を利用する。つまりこれが`std::move`だ。