5

std :: listの一部のメソッド、およびおそらく他のSTLコンテナーには、C++11で新しいオーバーロードが追加されています。必要なのはlist::splice()です。1つのメソッドはlist&パラメーターを取り、もう1つのメソッドはlist&&パラメーターを取ります。

違いは何か、どちらを選べばいいのか知りたいのですが。

libstdc ++(GCCコンパイラで使用される標準C ++ライブラリ)の実装を調べましたが、どちらの場合も内部でlist&&バージョンを使用しています。また、C++11仕様はこの問題について何も述べていません。違いを説明せずに2つの方法を提供するだけです。

リスト自体を移動したり、ノードを移動したりすることはありません(ポインターをコピーすることは、ノードをあるリストから別のリストに移動する方法のようです)。なぜそれが重要なのでしょうか。私には1つのアイデアしかありません。おそらく、list &&を使用することは、他のリストをもう必要としないコンパイラへの約束のようなものであり、コンパイラは他のリストを有効に保つ必要がないため、いくつかの操作を節約できます...

4

2 に答える 2

5

あまり気にする必要はありません。パラメータによるオーバーロードは、std::list&&渡す引数が右辺値の場合に選択されます。通常、参照するオブジェクトが一時的な場合です。使用するオーバーロードを明示的に指定する必要はありません。

std::listこれらの2つのバージョンの関数が存在する理由は、クライアントが一時オブジェクトをスプライスに渡す前に一時オブジェクトから一時変数を作成する必要がないようにするためです(コメントの@HowardHinnentに感謝します)。

また、スプライシング元のリストが一時オブジェクトである場合、その状態を維持することを気にする必要はありません。関数の&&バージョンは、そのリストから内臓を取り除いて、床全体に混乱を残す可能性があります。これは効率のために行われるかもしれません(しかし実際には、std::listそうする理由はあまりありません)。

二度と使用しないことがわかっている、、がある場合はstd::listother次を使用して、「私はあなたがそれをどうするかは気にしない」と自発的に言うことができますstd::move

l.splice(pos, std::move(other));

std::move(other)は右辺値であるため、splice関数はそれを一時的なものとして扱います。

于 2012-12-18T17:17:07.310 に答える
3

左辺値参照は左辺値にバインドされ、右辺値参照は右辺値にバインドされます。

tyedef std::list<Foo> lt;

lt make_list();

int main()
{
    lt x;

    lt tmp = make_list();

    x.splice(tmp);         // needs '&'
    x.splice(make_list()); // needs '&&'
}
于 2012-12-18T17:12:57.760 に答える