【问题标题】:Move Constructor, move vector between two objects using std::move?移动构造函数,使用 std::move 在两个对象之间移动向量?
【发布时间】:2013-01-24 21:30:17
【问题描述】:

我有一个类似以下的对象,我正在尝试实现一个移动构造函数,以便您可以插入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;
}

【问题讨论】:

  • 为什么要movebool
  • @us2012 我只是好奇std::move&lt;bool&gt; 或其他整数类型会发生什么。是否将值复制到this.Valid,然后将other.Valid 设置为bool 的默认值(又名false)?

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 好的,谢谢,但是在移动赋值运算符中呢? vPoint = std::move(other.vPoint) 合适吗?
【解决方案2】:

(部分答案 - 回答关于moveing bool

cppreference.comstd::move 有以下说法:

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

所以你不能依赖boolmove 之后成为truefalse

【讨论】:

  • 啊,好的,谢谢,从测试看来,内置类型没有移动构造函数,所以bool b = std::move&lt;bool&gt;(other.b) 基本上只是一个赋值。
  • 一项作业满足搬家的所有要求,但似乎没有任何改进方法。
  • @DavidSchwartz 是的,我希望有一个编译器警告或其他说明 std::move() 仅当该类型没有可用的移动构造函数时才会降级为赋值。
  • @NtscCobalt 希望得到警告可能是因为std::move 这个不幸的名字——它真的应该叫std::obtain_rvalue_reference。编译器无法知道(除了计算完整的调用图,可能还有很多进一步的语义分析)获得的引用是否将用于移动内容。
猜你喜欢
  • 1970-01-01
  • 2015-02-14
  • 2014-03-13
  • 2018-01-11
  • 2012-06-12
  • 2013-01-22
  • 2023-04-08
  • 2020-12-30
  • 2015-03-21
相关资源
最近更新 更多