为可移动物体存储"有效性"状态是一种好习惯吗?

NFR*_*RCR 8 c++

我正在设计一个库,许多类都是可移动的.许多可移动类作为参数传递给其他类的函数.我在考虑如何最小化验证检查的代码.在构造之后,可移动类的实例总是处于有效状态,但是在移动之后它们变为无效.

如果一个标志'有效'在构造之后是真的并且在移动之后变为假是一个好的做法.对象再次有效的唯一方法是将有效对象移入其中.

我还要提到,在移动对象之后,不要进入调用它们的函数会导致未定义的行为或任何东西的状态.移动后的内容就是垃圾.

Fil*_*efp 8

我应该,还是我不应该?

这样的标志可能适合于调试目的,但通常由开发人员使用您的库/代码来确保他/她从未以使用过后古怪的方式使用您的对象.

移动构造函数移动分配的整个目的是将数据移动srcdst,这实际上只src包含垃圾,而使用此类功能的开发人员应该意识到这一点.

注意:永远不应该形成错误的构造包括赋值运算符,应始终能够将新数据分配给移动的对象.


由于此举从一个对象通过变量访问(即一个左值)仅发生,如果开发商明确表示以1)开发商有这样的代码签名的使他一种无形的合同/她使用的任何副作用负责移动后的物体.

注: 1)通过std::move (val),static_cast<T&&> (val)或等同物.



标准图书馆

如果我们查看标准库,我们会发现实际上没有valid标志,而是(如上所述)直到开发人员以确保他不会在移动的对象上使用无效的构造.