1

ムーブ セマンティクスを試してみようと思いました。そのため、Scott Meyers が移動セマンティクスについて話している非常に粗い/低解像度のビデオを見つけましたが、そのビデオのコードは判読できませんでした。

そこで、文字列のベクトルをラップする使い捨てクラスを作成しました。

class ShoppingList
{
private:
    vector<string> m_vsList;
public:
    ...
};

移動セマンティクスを使用して、文字列の一時的なベクトルをメンバー変数 m_vsList に移動できるかどうか疑問に思っていましたか?

これを実現するには、次のような移動関数を記述します。

void MoveList( vector<string> && r )
{
    m_vsList = std::move(r);
}

VS2011 ベータ コンパイラでこれを試していることを述べておく必要があります。

質問

これは正しい/可能ですか? もしそうなら、どうすれば一時的に指定できますvector<string>か?

たとえばMoveList( {string("c"), string("b"), string("a")} )無効です。

ムーブ セマンティクスをムーブ コンストラクターやムーブ割り当てオーバーロードに制限する必要がありますか?

std::m_vsList に移動し、m_vsList に既にデータが含まれている場合、そのデータはどうなりますか? では、移動する前にそのベクトルを明示的にクリアする必要がありますか?

4

2 に答える 2

0

コンパイラが初期化リストをサポートしていない場合は、次のようにして空の右辺値ベクトルを作成できます。

MoveList(vector<string>());

または空でない右辺値:

vector<string>  lv_vec; 
lv_vec = ...
MoveList(vector<string>(lv_vec));
于 2012-05-25T10:46:12.503 に答える
0

はい、それは正しく、可能です。の右辺値対応バージョンを参照してくださいstd::map::operator[] (Key&& key)

テスト用にテンポラリを作成したい場合、コンパイラがイニシャライザ リストを完全にサポートすると、上にリストしたものが機能するはずです。今のところ、 を返す関数を作成するstd::vector<std::string>か、単純に非一時的なベクトルを作成して使用することができます。std::move

于 2012-05-17T21:43:17.083 に答える