質問

たとえばます:

Beta_ab&&
Beta::toAB() const {
    return move(Beta_ab(1, 1));
}
役に立ちましたか?

解決

Beta_ab&&
Beta::toAB() const {
    return move(Beta_ab(1, 1));
}

これは単に左辺値基準ケースと同様に、ダングリング参照を返します。関数が戻った後、一時的なオブジェクトが破壊されます。あなたは次のように、値によってBeta_abを返す必要があります。

Beta_ab
Beta::toAB() const {
    return Beta_ab(1, 1);
}

さて、それは適切に関数の戻り値に一時的Beta_abオブジェクトを移動しています。コンパイラができれば、それはRVO(戻り値の最適化)を使用することにより、完全に動きを避けることができます。さて、あなたは次の操作を行うことができます。

Beta_ab ab = others.toAB();

そして、それはabに一時的に構築移動したり、完全に移動またはコピーをやって省略するRVOを行います。私は BoostCon09右辺値は、問題を説明し101 に、そしてどのように(参考資料読みすることをお勧めいたしますN)RVOはこれと対話するために起こります。

<時間>

右辺値参照を返すあなたの場合は、他の場面で良いでしょう。あなたは、多くの場合、一時的に呼び出すgetAB()機能を持っている想像してみてください。それは右辺値一時のためのconst左辺値参照を返す作るために最適ではないのです。あなたはこのようにそれを実装することができる。

struct Beta {
  Beta_ab ab;
  Beta_ab const& getAB() const& { return ab; }
  Beta_ab && getAB() && { return move(ab); }
};

move自動ローカルでも一時的な右辺値でもないので、この場合はabは、オプションではないことに注意してください。さて、のREF-修飾子&&は、第二の機能は、コピーの代わりに

、次の動きを作り、右辺値一時に呼び出されることを言います
Beta_ab ab = Beta().getAB();

他のヒント

こののビットの異なる文脈において、例えば、より効率的にすることができます:

template <typename T>
T&& min_(T&& a, T &&b) {
    return std::move(a < b? a: b);
}

int main() {
   const std::string s = min_(std::string("A"), std::string("B"));
   fprintf(stderr, "min: %s\n", s.c_str());
   return 0;
}

は、興味深い観察したように、私のマシン上でclang++ -O3は、通常のstd::minのための62個の指示に対し、上記のコードのための54個の命令を生成します。しかし、-O0では正規std::minため481に対して上記コードの518個の命令を生成します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top