1

これは、C++11 の右辺値参照を使用してセマンティクスを移動し、便利なラッパーを実装する正しい方法std::reverse()ですか?

template <class BIDirContainer> inline BIDirContainer&& reverse(BIDirContainer a) {
    std::reverse(begin(a), end(a));
    return std::move(a); 
}

コードは私のテストケースで機能しますが、パフォーマンスについて&&はわかりません。ここで使用する必要がありますか、それとも不要ですか?

4

3 に答える 3

3

(右辺値) 参照で戻る場合aは、ローカル オブジェクトであるため、ダングリング参照を取得します。値で返すと、すべてが「うまくいく」はずです。

于 2012-04-19T12:17:06.107 に答える
2

それを行う正しい方法は、関数から値で返すことだと思います:

template <class BIDirContainer> inline BIDirContainer reverse(BIDirContainer a) {
    std::reverse(begin(a), end(a));
    return a; 
}

移動コンストラクタがない場合はBIDirContainer移動コンストラクタを指定します。するとこんな表現。

BIDirContainer x = ...;
BIDirContainer backwards{reverse(x)};

関数内のテンポラリの内容を に移動する必要がありaます。reversebackwards

于 2012-04-19T12:21:30.243 に答える
0

したがって、パラメータを変更する場合は...

template <class BIDirContainer>
inline BIDirContainer& reverse(BIDirContainer& a)
{
    std::reverse(begin(a), end(a));
    return a;
}

反転コピーを作成する場合は、次のようにします。

template <class BIDirContainer>
inline BIDirContainer reverse(BIDirContainer a)
{
    std::reverse(begin(a), end(a));
    return a;
}

関数の戻り値はすでに右辺値 (具体的には「xvalue」) です。移動セマンティクスを持つ関数に渡すと、移動されますが、上記の名前付き戻り値の最適化 (NRVO)resultにより、インプレースで構築される場合もあります (移動セマンティクスよりも優れています)。

于 2012-04-19T12:31:02.650 に答える