ゆとりーなの日記

日記的な事を書いて行くと思はれる

ムーブについてどこかでいじられていたのは何時だったか

C++0xからはmoveという新しい概念が登場しました。以前constなローカルオブジェクトを返すときにムーブが働かないのなんでやーとか思ってました。constだろうがなかろうが、どうせ関数出たら捨てられるんだからmoveでぶっ壊したってええやないかとか思ってました。
でもよく考えたらムーブが働くときに取られる引数には普通const付きませんから、どう頑張ってもconstなオブジェクトがムーブに渡されることはないんですね。残念な限りです。
正直なところ関数内で作ったオブジェクトを非constな操作を行わないでごにょごにょしたあとに返すって場合もあるかと思いますが、このような場合にconstを付けたくなるのは人情です。しかしmoveのことを考えるとconstが付けられないのは悲しいですね。NRVOに期待してconstを付けるのもありかと思いますが、そもそもな問題として、戻り値として返すときはconstなローカルオブジェクトをムーブしてもいいような気がするのは気のせいなんですかね。
追記:
すばる先生のmoveの記事を見てそういえばstd::moveとかあったなぁと思いだしたので色々試してみました。

#include <iostream>
#include <utility>

struct x {
  x() {}
  x(const x &rhs) {std::cout << "コピー" << std::endl;}
  x(x &&rhs) {std::cout << "ムーブ" << std::endl;}
};

x foge() {
  const x cx;
  return std::move(cx);
}

int main() {
  const x tx = foge();
  return 0;
}

これでムーブされたらどうしようとか焦りましたが普通にコピーコンストラクタが呼ばれました。std::moveの戻り値の型はconst x &&になると思うのでこいつがx &&を取るムーブコンストラクタにぶち込まれたらびっくりです。const x &の方に行ってくれるみたいですね。
因みにxに

x(const x &&rhs) {std::cout << "ムーブ" << std::endl;}

とか書いておくとムーブコンストラクタ?が呼ばれますがこいつに一体何の意味があるのかとかは知りません。
あと全体的にwell-formedかとかはすいません。よく分かりません。