12

私は次のようなオブジェクトを持っています。私は移動コンストラクターを実装しようとしていますstd::vector<Mesh>

struct Mesh
{    
    std::vector<Vector3> vPoint;
    bool Valid;

    Mesh(Mesh&& other)
    {
        vPoint = std::move(other.vPoint);
        Valid = std::move(other.Valid);
    }
};

これは正しい方法ですか?もしそうなら、 std::move が操作された後の other.Valid の値は何ですか?

編集:

また、このオブジェクトのインスタンスがある場合、次のシナリオで std::move を使用する必要がありますか?

std::vector<Mesh> DoSomething()
{
    Mesh mesh; //Imagine vPoint is filled here to

    std::vector<Mesh> meshes;
    meshes.push_back(std::move(mesh)); // Here is my question, std::move? or just pass mesh here?

    return meshes;
}
4

2 に答える 2

14

次のように移動コンストラクターを作成する必要があります。

Mesh( Mesh&& other )
: vPoint( std::move( other.vPoint ) )
, Valid( std::move( other.Valid ) )
{}

コンストラクター初期化子リストを使用する場合とは対照的に、コンストラクター本体内での割り当ての欠点は、前者の場合、Mesh移動先のオブジェクトのメンバー オブジェクトがデフォルトで構築され、本体内で割り当てられることです。後者の場合、それらはstd::move呼び出しの結果から直接構築されます。

オブジェクトを移動した後、それが整数型であろうと、より複雑なオブジェクトであろうと、オブジェクトから読み取るべきではありません。このようなオブジェクトは、不特定の状態で存在します。

于 2013-02-09T01:57:49.020 に答える
3

(部分的な回答 - moveingについて少し回答bool)

cppreference.comは、次のように述べていますstd::move

ライブラリ コードは引数に有効な値を残す必要がありますが、型または関数が別の方法で文書化されていない限り、結果の引数値に他の制約はありません。これは、moved from 引数を再度使用しないことが一般的に最も賢明であることを意味します。

boolしたがって、 aがいずれかtrueまたはingのfalse後にあることに依存することはできません。move

于 2013-02-09T01:56:35.973 に答える