我正在学习一门C++课程,这里是一个示例移动构造函数的实现:
/// Move constructor
Motorcycle::Motorcycle(Motorcycle&& ori)
: m_wheels(std::move(ori.m_wheels)),
m_speed(ori.m_speed),
m_direction(ori.m_direction)
{
ori.m_wheels = array<Wheel, 2>();
ori.m_speed = 0.0;
ori.m_direction = 0.0;
}
(m_wheels
是类型为std::array<Wheel, 2>
的成员,而Wheel只包含double m_speed
和bool m_rotating
。在Motorcycle
类中,m_speed
和m_direction
也是double
类型。)
我不太明白为什么需要清除ori
的值。
如果一个Motorcycle
有任何我们想要“窃取”的指针成员,那么我们必须设置ori.m_thingy = nullptr
,以免例如两次delete m_thingy
。但当字段包含对象本身时,这是否重要呢?
我问了一个朋友,他们让我看这个页面,上面写着:
移动构造函数通常“窃取”参数持有的资源(例如指向动态分配对象的指针、文件描述符、TCP套接字、I/O流、运行中的线程等),而不是复制它们,并将参数留在某些有效但其他方面不确定的状态。例如,从
std::string
或std::vector
移动可能会导致参数被清空。但是,不应依赖这种行为。
谁定义了不确定状态的含义?我不明白为什么将速度设置为0.0
比不修改更加不确定。并且正如引用中的最后一句话所说-代码不应依赖于移动后的Motorcycle
状态,那为什么还要清除它呢?
wheels
数组。 - user253751