我有一个类似下面的对象,我试图实现一个移动构造函数,因此你可以为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;
}
答案 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
之后false
或move
不能依赖{{1}}。