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

时间:2013-02-09 01:38:53

标签: c++ c++11 move-semantics

我有一个类似下面的对象,我试图实现一个移动构造函数,因此你可以为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;
}

2 个答案:

答案 0 :(得分:10)

您应该按如下方式编写移动构造函数:

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

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

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

答案 1 :(得分:3)

(部分答案 - 回答关于move bool}

的问题

cppreference.com有以下关于std::move

的说法
  

库代码需要在参数中保留有效值,   但除非类型或功能文件另有说明,否则没有   对结果参数值的其他约束。这意味着   通常最明智的做法是避免再次使用移动参数。

因此bool true之后falsemove不能依赖{{1}}。