移动构造函数,使用std :: move在两个对象之间移动向量?

Nts*_*alt 10 c++ move-semantics c++11

我有一个类似下面的对象,我正在尝试实现一个移动构造函数,因此你可以有一个插入std::vector<Mesh>.

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

    Mesh(Mesh&& other)
    {
        vPoint = std::move(other.vPoint);
        Valid = std::move(other.Valid);
    }
};
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?如果是这样,在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;
}
Run Code Online (Sandbox Code Playgroud)

Pra*_*ian 11

您应该编写移动构造函数,如下所示:

Mesh( Mesh&& other )
: vPoint( std::move( other.vPoint ) )
, Valid( std::move( other.Valid ) )
{}
Run Code Online (Sandbox Code Playgroud)

与使用构造函数初始化程序列表相反,在构造函数体内赋值的缺点是,在前一种情况下Mesh,您要移动到的对象的成员对象是默认构造的,然后分配到正文中.在后一种情况下,它们是直接根据std::move呼叫结果构建的.

移动后,您不应该从对象中读取,无论是整数类型还是更复杂的对象.这些对象存在于未指定的状态.