我正在学习的 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>
, and Wheel仅包含一个double m_speed
and a bool m_rotating
。在里面摩托车 class, m_speed
and m_direction
也都是double
s.)
我不太明白为什么ori
的值需要清除。
If a Motorcycle
有任何我们想要“窃取”的指针成员,那么当然,我们必须设置ori.m_thingy = nullptr
以免,例如,delete m_thingy
两次。但是当字段包含对象本身时,这很重要吗?
我问了一个朋友这个问题,他们向我指出了这一页 http://en.cppreference.com/w/cpp/language/move_constructor,其中说:
移动构造函数通常“窃取”参数所持有的资源(例如,指向动态分配对象的指针、文件描述符、TCP 套接字、I/O 流、运行线程等),而不是复制它们,并将参数保留在一些有效但不确定的状态。例如,从std::string
或来自std::vector
可能会导致参数留空。但是,不应依赖此行为。
谁定义什么不确定状态方法?我不明白如何设置速度0.0
还有吗不定而不是放任不管。就像引用中的最后一句话所说的那样——代码不应该依赖于移出的状态摩托车无论如何,为什么要费力清理它呢?
他们不need进行清洁。该类的设计者认为,将移出的对象保留为零初始化是一个好主意。
请注意,确实有意义的情况是对于管理在析构函数中释放的资源的对象。例如,指向动态分配的内存的指针。使移出对象中的指针保持不变将意味着两个对象管理相同的资源。它们的两个析构函数都会尝试释放。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)