タグ

2015年1月7日のブックマーク (2件)

  • 右辺値参照とムーブコンストラクタの使い方 - C++ プログラミング

    C++ ではお馴染みの代入演算子ですけど、通常は、左辺の値を右辺の値で置き換えるという動作をします。 従来からの C++ のクラスの代入演算子では、左辺のクラスが右辺の値を受け取って処理をするような定義になっています。 右辺の値は書き換えられないので、たとえば右辺の値を左辺が引き継いで使用するとき、右辺の値がポインタだったりする場合には、大抵はどんなときでも、右辺の値を新しい値としてまるごと複製しなければいけなくなります。 このとき、もしもそのまま右辺のポインタを左辺に設定してしまうと、左辺と右辺の両方で同じポインタを使ってしまうため、たとえば左辺と右辺のどちらかが解放されるときに、もう片方でも使用中のポインタが示すメモリを開放してしまう恐れがあります。 そのため、ポインタが指す先のメモリを丸ごとコピーして新しい値として設定する必要があるのですが、それにかかるコストが大きい場合に問題になる

    syohex
    syohex 2015/01/07
    同様に、関数が return で返す変数も、それが関数内で定義されたクラスだった場合にはそれ以降使われることはないので、std::move 関数を使わなくても、コンパイラが自動的に右辺値参照として扱ってくれます
  • 本の虫: rvalue reference 完全解説

    目的 この記事は、C++0xのrvalue referenceを完全に解説せんとする目的を以て書かれた。サンプルコードは最小に留め、エラー処理等は省いた。この記事さえ読めば、今日からrvalue referenceを恐れることなく使う物のC++0xプログラマになれるだろう。 lvalueとrvalueについて Cの時代では、lvalueとrvalueの違いは、代入演算子の左側か右側かという違いだけであった。つまり、left hand value, right hand valueの略である。従って、訳語も、左辺値、右辺値であった。C++においては、これはもはや正しくはない。従って、右辺値、左辺値というのも、誤訳である。それ故に、ここでは、これ以上、左辺値、右辺値という名称を使用しない。 誤解を恐れずにいえば、lvalueとは、明示的に実体のある、名前付きのオブジェクトであり、rvalue

    syohex
    syohex 2015/01/07
    rvalue reference