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

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

因此,您不能依赖 abool成为truefalsemoveing 之后。

于 2013-02-09T01:56:35.973 回答